• 集合


    第十章 Collection集合框架

    常用方法:
    c.add( E e);//向集合中追加元素
    c.size();//集合中元素的个数
    c.isEmpty();//判断集合中是否有元素,无元素返回true
    c.isContains(Object o);//判断几个中是否包含给定元素
    c.clear();//清空集合,使集合中无元素,size()=0,isEmpty()为true
    c.remove(Object other);//将给定元素从当前集合中删除
    c.addAll(c1);//将集合c1中的元素添加到c集合中
    c.removeAll(c1);//删除c1集合和当前集合共有的元素
    c.containsAll(c1);//判断集合c是否完全包含给定的c1集合中的元素
    Iterator it = c.iterator();//创建一个迭代器
    it.hasNext();//判断是否有下一个元素
    String str = (String)it.next();//获取下一个元素
    it.remove();//迭代器提供的删除方法,一次只能删除一个元素
    for each//jdk5后推出的新特性,新循环,冒号后是数组或集合,冒号前是声明接收元素的变量
    Type<String>//泛型,也称为参数化类型,引用类时允许传入指定类型来约束类中(某个属性,方法的参数,方法的返回值)的类型,提高代码的灵活性,长用于约束集合中元素的类型;


    * java.util.Collection 集合框架
    * 集合与数组相似,都用来存放一组元素。但是集合提供了操作元素的相关方法,使用更方便;
    * 并且集合含有多种不同的实现结构,将来结合实际需求选择合适的实现类来存放元素;
    *集合存放的是元素的引用

     1 public class CollectionDemo {
     2 public static void main(String[] args) {
     3 /*
     4 * Collection接口下面有两个常用的派生接口“
     5 * java.util.List; 线性表,特点:可重复,有序。即相同元素可以重复放入集合;
     6 * java.util.Set; 元素不可重复;默认无序,但是有有序的实现方法;
     7 * 元素是否重复依靠的是元素自身equals比较的结果;
     8 */
     9 Collection c = new ArrayList();
    10 /*
    11 * boolean型方法:add(E,e);
    12 * 向当前集合中添加给定元素,若成功添加则返回true,反之则false;
    13 * (E,e)先理解为object
    14 */
    15 c.add("one");
    16 c.add("two");
    17 c.add("three");
    18 c.add("four");
    19 c.add("one");
    20 System.out.println("ArrayList:"+c);//ArrayList:[one, two, three, four, one]
    21 int size = c.size();
    22 //size是指集合中元素的个数
    23 //size和数组中的length不是一个概念,length是数组在创建时声明的元素个数,不能随便添加超过length的元素,集合则不限制
    24 System.out.println("size:"+size);//size:5
    25 
    26 //判断当前集合是否为空集。空集是指集合不含任何元素,与null意义不同,null意味着没有集合,空集指有集合,但集合中无元素
    27 boolean isEmpty = c.isEmpty();
    28 System.out.println("空集:"+isEmpty);//空集:false
    29 
    30 //void clear(); 清空集合
    31 c.clear();
    32 System.out.println("集合已清空!");
    33 System.out.println("size:"+c.size());//0
    34 System.out.println("空集:"+c.isEmpty());//true
    35 System.out.println(c);//[]
    36 
    37 //    Collection d = new HashSet();//元素不可重复;默认无序,但是有有序的实现方法;
    38 //    d.add("one");
    39 //    d.add("two");
    40 //    d.add("three");
    41 //    d.add("four");
    42 //    d.add("one");
    43 //    System.out.println("HashSet:"+d);//HashSet:[four, one, two, three]
    44 }
    45 }
    46 
    47 * boolean 型,remove(Object other);
    48 * 将给定元素从当前集合中删除;
    49 * 删除的标准是集合会顺序将给定元素与集合现有元素进行equals比较并删除比较结果为true的元素;
    50 * (若集合中存在重复元素,只删除一个,即调用一次remove方法,只删除一个元素)
    51 boolean remove = c.remove(p);
    52 
    53 * boolean 型,contains(Object o)
    54 * 判断当前集合是否包含给定的元素
    55 Point p = new Point(1,2);
    56 boolean contains = c.contains(p);
    57 System.out.println("包含:"+contains);
    58 
    59 
    60 Collection c = new ArrayList();
    61 c.add("java");
    62 c.add("android");
    63 c.add("ios");
    64 System.out.println("c: "+c);
    65 //c: [java, android, ios]
    66 Collection c1 = new HashSet();
    67 c1.add("c");
    68 c1.add("c++");
    69 c1.add("c#");
    70 c1.add("java");
    71 System.out.println("c1:"+c1);
    72 //c1:[c#, c++, c, java]
    73 * boolean型,addAll(Collection c)
    74 * 将给定集合元素存入当前集合中
    75 c.addAll(c1);
    76 System.out.println("c: "+c);
    77 //c: [java, android, ios, c#, c++, c, java]
    78 c1.addAll(c);
    79 System.out.println("c1:"+c1);
    80 //c1:[c#, c++, c, java, android, ios]
    81 
    82 Collection c2 = new ArrayList();
    83 c2.add("java");
    84 c2.add("php");
    85 c2.add("python");
    86 c.removeAll(c2);//删除当前集合中与给定集合共有的元素
    87 //c: [android, ios, c#, c++, c]
    88 
    89 
    90 boolean containsAll = c.containsAll(c1);
    91 //判断当前集合是否完全包含给定集合元素;
    92 System.out.println("c是否包含c1:"+containsAll);

    【遍历集合】

    package collection;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    /**
    * 集合提供了统一的获取元素的方式:遍历集合
    * 而集合遍历采取的是迭代器模式
    * 集合定义了方法:
    * Iterator iterator()
    * 该方法可以获取一个用于遍历当前集合的迭代器
    * 
    * java.util.Iterater接口
    * 该接口规定了迭代器遍历集合的相关方法,不同的集合都实现了一个迭代器的实现类用于遍历自身元素
    * 我们无需记住每个迭代器实现类的名字,只要以多态角度当作Iterator看待,并调用相关方法遍历集合元素即可
    * 
    * 迭代器遍历集合遵循步骤:问,取,删
    * 其中删除元素不是必须操作;
    */
    public class IteratorDemo {
    public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add("one");
    c.add("#");
    c.add("two");
    System.out.println(c);
    /*
    * 遍历集合
    * 1:获取用于遍历当前集合的迭代器
    * 2:一次问一个,取一个,删一个
    */
    Iterator it = c.iterator();
    while(it.hasNext()) {//
    String str = (String)it.next();//
    System.out.print(str+"	");
    if("#".equals(str)) {
    //    c.remove(str);
    //迭代器要求在遍历的过程中不能通过集合的方法增删元素,否则遍历过程会抛出异常;
    it.remove();//删,迭代器自带的删处方法,一次删除一个    
    }
    }
    System.out.println();
    System.out.println(c);
    }
    }
    
    
    【增强for循环】,也称为新循环,for each
    package collection;
    /**
    * jdk5之后退出了一个特性:增强for循环
    * 增强for循环也称为新循环,for each
    * 作用是遍历数组或遍历集合使用,所以不取代传统for循环工作
    * 
    * 新循环并非jvm认可,而是编译认可,使用新循环遍历数组最终会被编译器在编译时改变为传统的for循环遍历;
    */
    //遍历数组
    public class NewForDemo {
    public static void main(String[] args) {
    String[] array = {"one","two","three","four","five"};
    //传统循环遍历
    for(int i=0;i<array.length;i++) {
    String str = array[i];
    System.out.print(str+"	");
    }
    System.out.println();
    //新循环
    for(String str : array) {
    System.out.print(str+"	");
    }
    System.out.println();    
    }
    }
    
    //遍历集合
    package collection;
    import java.util.ArrayList;
    import java.util.Collection;
    /**
    * 新循环遍历集合
    */
    public class NewForDemo2 {
    public static void main(String[] args) {
    Collection c = new ArrayList();
    c.add("one");
    c.add("#");
    c.add("two");
    System.out.println(c);    
    for(Object o : c) {
    String str = (String)o;
    System.out.println(str);
    }
    //新循环遍历集合会被编译器改变为迭代器遍历,
    //所以在新循环遍历集合的过程中不要对集合元素做增删操作,否则抛异常ConcurrentModifiationException
    
    }
    }

    【泛型】

     1 package collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 
     6 /**
     7 * jak5之后推出了特性:泛型
     8 * 泛型也称为参数化类型,允许我们在使用某个类时,传入指定的类型来约束该类中某个属性,方法的参数或返回值的类型
     9 * 这样做可以提高代码的灵活性
    10 * 泛型最常用的地方就是集合中,用于约束集合中的元素类型
    11 *例如:<String>,<Integer>,<Double>,<Boolean>
    12 */
    13 public class CollectionDemo6 {
    14 public static void main(String[] args) {
    15 Collection<String> c = new ArrayList<String>();
    16 /*
    17 * 由于add方法参数类型为泛型,这里编译器会检查实际传入的参数是否符合该泛型要求,不符合编译不通过
    18 */
    19 c.add("one");//编译器检查实参是否为String类型
    20 c.add("two");
    21 c.add("three");
    22 c.add("four");
    23 System.out.println(c);
    24 //由于集合指定了泛型,新循环遍历可以直接使用String接收
    25 for(String str:c) {
    26 System.out.println(str);
    27 }
    28 
    29 }
    30 }

    第十一章 List & Set

    * Collection接口下面有两个常用的派生接口“
    * java.util.List; 线性表,特点:可重复,有序。即相同元素可以重复放入集合;
    * java.util.Set; 元素不可重复;默认无序,但是有有序的实现方法;

    【List】
    * java.util.List 接口
    * List是可重复集合,特点是有序,提供了一组通过下标操作元素的方法
    * 通用实现类:
    * java.util.ArrayList:数组实现,查询效率好,增删慢
    * java.util.LinkedList:链表实现,增删效率好,尤其首尾增删元素效率最高,查询慢;

    List<Integer> list = new ArrayList<Integer>();

    list.get(int index); 获取指定下标位置的元素;
    list.set(int index,E e); 将指定下标位置的元素替换为新元素;
    list.add(int index,E e); 将给定元素插入到指定位置;
    list.remove(int index); 删除并返回指定位置对应的元素;
    list.subList(int fromIndex, int toIndex); 获取集合的子集,包头不包尾;
    用subList()获取子集后,对子集的操作就是对原集合对应元素的操作;
    list.subList(2,5).clear(); 可以看做是对原集合第三到第五个元素的删除;

    【集合转换为数组】:
    list.toArray(); jdk5之前集合提供了转数组的无参方法,返回值是Object类型,需强转
    list.toArray( new String[list.size()] ); jdk5之后集合提供了转数组的有参方法,参数为需要转换的数组对象,集合按参数数组类型转换为数组

    【数组转集合】:
    数组的工具类:Arrays提供了一个静态方法asList(),该方法可将一个数组转换为一个List集合
    List<String> list = Arrays.asList(arr);

    数组转换为集合后,对集合元素的修改就是对原数组对应元素的修改;
    并且不支持添加新元素或删除已有元素;
    (否则报异常:UnsupportedOperationException)
    若希望增删元素,需要重新创建一个集合;
    所有集合都提供了一个参数为Collection的构造方法,
    作用是在创建当前集合的同时包含给定集合中的所有元素
    List<String>list2 = new ArrayList<String>(list);
    //创建list2的同时包含list的所有元素

    【小案例】
    * 将子集每个元素扩大10倍

    for(int i = 0; i < subList.size() ; i++ ){
    int num = subList.get(i);
    subList.set(i, num*10);
    }
    System.out.println(subList);

    【集合排序】
    集合工具类:Collections
    其提供了很多操作集合的静态方法,其中sort(List list)方法是对List集合进行自然排序(从小到大)
    Collections.sort(List list);
    用该方法排序自定义类型元素的集合时,要求集合元素必须实现Comparable接口,否则编译不通过;
    例如:class Point implements Comparable<Point>{
    重写compareTo方法
    * 该方法的意义是定义当前对象(this)与参数对象(o)之间的大小关系
    * 返回值int,返回值不关注具体取值,只关注取值范围
    * 当返回值>0,当前对象大于参数对象this>o
    * 当返回值=0; this==o
    * 当返回值<0, this<o
    }
    Collections.sort(List list)方法排序集合存在两点不足:
    1:由于依赖集合元素自身的比较规则,所以强制要求集合元素必须实现Comparable接口并重写比较规则,这会导致我们在排序自定义元素时必须做此事;那么我们称该方法对我们的程序有侵入性。(使用某个功能时,其要求我们改的代码越多侵入性越强)
    2:java提供了很多类实现了Comparable接口,比如Integer,String等;
    但有时候它们提供的比较规则不满足我们对于元素的排序需求,这时该sort方法也无法使用;

    Collections提供了另一个重载的sort方法,可以单独指定一个比较器Comparator,这种方式解决了之前sort方法的两个不足,实际开发中推荐使用这种方式。
    【例】按字符串的长短排序,制作比较器

    Comparator com = new Comparator(){
    public int compare(String s1 , String s2){
    return s1.length()-s2.length();
    }
    };
    Collections.sort( list , com );


    【队列】Queue
    java.util.Queue;队列
    a:队列也可以保存一组元素,但是存取元素必须遵循先进先出原则;
    queue.offer("one");//入队操作,等同于add();
    queue.poll(); //出队操作,获取队首元素并将之移除
    queue.peek(); //引用队首元素,并不移除


    【双端队列】
    java.util.Deque;双端队列,继承自Queue接口
    b:双端队列是两端都做进出队操作的队列,常用实现类LinkedList
    deque.offer("one");//入队操作,等同与add()
    deque.offerFirst("two");//将two添加到队首
    deque.offerLast("three");//将three添加到队尾
    deque.poll(); //出队操作,获取队首元素并将之移除
    deque.pollFirst(); //获取队首元素并将之移除
    deque.pollLast(); //获取队尾元素并将之移除

    【栈队列】
    stack栈结构,通过双端队列来实现
    c:栈也可以保存一组元素,但是存取元素必须遵循先进后出原则;
    Deque接口为栈提供了相应的方法:push,pop
    stack.push("one");//将one放入栈口;
    stack.pop(); //获取栈口元素并将之移除
    java实际开发中经常使用栈实现“后退”这样的功能;

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    Tomcat造成404
    ajax缺少@ResponseBody注解前台404,业务可以运行
    几种常见的Runtime Exception
    SQL注入通俗讲解
    MYSQL数据库导入大数据量sql文件失败的解决方案
    css选择器
    http端口
    基础算法之最大子列求和问题
    基础算法之链表逆序
    Prolog&Epilog
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/9153326.html
Copyright © 2020-2023  润新知