• 集合(collection)


     

    使用数组存放数据的弊端:长度不可变,而集合可以动态的添加值

     

    java集合类不仅可以存储数量不等的多个对象,还可以保存具有映射关系的关联数组

     

     

     

    /*
    * 1.存储对象可以考虑:①数组 ②集合
    * 2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Student();....
    * >弊端:①一旦创建,其长度不可变。②真实的数组存放的对象的个数是不可知。
    * 3.集合
    * Collection接口
    *    |------List接口:存储有序的,可以重复的元素
    *      |------ArrayList(主要的实现类)、LinkedList(对于频繁的插入、删除操作)、Vector(古老的实现类、线程安全的)
    *    |------Set接口:存储无序的,不可重复的元素
    *      |------HashSet、LinkedHashSet、TreeSet
    * Map接口:存储“键-值”对的数据
    *    |-----HashMap、LinkedHashMap、TreeMap、Hashtable(子类:Properties)
    */

     

     

    java集合有Collection和Map集合两种

    Collection接口:

      Set集合:元素之间无序,不可重复

      List集合:元素有序、可以重复

    Map集合:具有映射关系的键值对

     

    Collection的继承体系:

     

     Map集合的继承体系

    Collection接口:

    Collection接口是List、Set、Queue接口的父接口

    在java5之前,java集合会丢失容器中所有对象的数据类型,把所有的对象都当做Object对象,java5之后,增加了泛型,java集合可以记住容器中的对象的数据类型

     

    List接口的实现类之一:ArrayList

     

    使用Iterator接口遍历集合中的元素,还可以使用增强for进行遍历

     

     

    List接口中的元素都有一个整数序号来记录元素的位置,可以根据序号来获取元素

    List接口的常用实现类:ArrayList、LinkedList、Vector

     

     ArrayList是List接口的典型实现类,本质上,ArrayList是对象引用的一个变长数组

    ArrayList是线程不安全的,而Vector是线程安全的,即使要保证List是安全的,也不用Vector

    Arrays.asList()方法返回的List集合是一个固定长度的List集合,不是ArrayList实例,也不是Vector的实例

     

     

     1 public void collection1() {
     2         Collection coll = new ArrayList();
     3         // 1.size():返回集合中元素的个数
     4         System.out.println(coll.size());
     5         // 2.add(Object obj):向集合中添加一个元素
     6         coll.add(123);
     7         coll.add("AA");
     8         coll.add(new Date());
     9         coll.add("BB");
    10         System.out.println(coll.size());
    11         // 3.addAll(Collection coll):将形参coll中包含的所有元素添加到当前集合中
    12         Collection coll1 = Arrays.asList(1, 2, 3);
    13         coll.addAll(coll1);
    14         System.out.println(coll.size());
    15         // 查看集合元素
    16         System.out.println(coll);
    17         // 4.isEmpty():判断集合是否为空
    18         System.out.println(coll.isEmpty());
    19         // 5.clear():清空集合元素
    20         coll.clear();
    21         System.out.println(coll.isEmpty());
    22     }
     1 public void collection2() {
     2         Collection coll = new ArrayList();
     3         coll.add(123);
     4         coll.add(new String("AA"));
     5         coll.add(new Date());
     6         coll.add("BB");
     7         // Person p = new Person("MM",23);
     8         coll.add(new Person("MM", 23));
     9         System.out.println(coll);
    10         // 6.contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,反之返回false
    11         // 判断的依据:根据元素所在的类的equals()方法进行判断
    12         // 明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法!
    13         boolean b1 = coll.contains(123);
    14         b1 = coll.contains(new String("AA"));
    15         System.out.println(b1);
    16         boolean b2 = coll.contains(new Person("MM", 23));
    17         System.out.println(b2);
    18         // 7.containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素
    19         Collection coll1 = new ArrayList();
    20         coll1.add(123);
    21         coll1.add(new String("AA"));
    22 
    23         boolean b3 = coll.containsAll(coll1);
    24         System.out.println("#" + b3);
    25         coll1.add(456);
    26         // 8.retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合
    27         coll.retainAll(coll1);
    28         System.out.println(coll);
    29         // 9.remove(Object obj):删除集合中的obj元素。若删除成功,返回true。否则,返回false
    30         boolean b4 = coll.remove("BB");
    31         System.out.println(b4);
    32 
    33     }
     1 public void collection3() {
     2         Collection coll = new ArrayList();
     3         coll.add(123);
     4         coll.add(new String("AA"));
     5         coll.add(new Date());
     6         coll.add("BB");
     7         coll.add(new Person("MM", 23));
     8         
     9         Collection coll1 = new ArrayList();
    10         coll1.add(123);
    11         coll1.add(new String("AA"));
    12         // 10.removeAll(Collection coll):从当前集合中删除包含在coll中的元素。
    13         coll.removeAll(coll1);
    14         System.out.println(coll);
    15         //11.equals(Object obj):判断集合中的所有元素是否完全相同
    16         Collection coll2 = new ArrayList();
    17         coll2.add(123);
    18         coll2.add(new String("AA1"));
    19         System.out.println(coll1.equals(coll2));
    20         //12.hashCode():
    21         System.out.println(coll.hashCode());
    22         System.out.println();
    23         //13.toArray() :将集合转化为数组
    24         Object[] obj = coll.toArray();
    25         for(int i = 0;i < obj.length;i++){
    26             System.out.println(obj[i]);
    27         }
    28         System.out.println();
    29         //14.iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历!
    30         Iterator iterator = coll.iterator();
    31         //方式一:不用
    32         /*System.out.println(iterator.next());
    33         System.out.println(iterator.next());
    34         System.out.println(iterator.next());*/
    35         //方式二:不用
    36 //        for(int i = 0;i < coll.size();i++){
    37 //            System.out.println(iterator.next());
    38 //        }
    39         //方式三:使用
    40         while(iterator.hasNext()){
    41             System.out.println(iterator.next());
    42         }
    43     }
     1 @Test
     2     public void test(){
     3         String[] str = new String[]{"AA","BB","DD"};
     4         for(String s : str){
     5             s =  "MM";//此处的s是新定义的局部变量,其值的修改不会对str本身造成影响。
     6             System.out.println(s);
     7         }        
     8         
     9         for(int i = 0;i < str.length;i++){
    10             System.out.println(str[i]);
    11         }
    12     }
    13     @Test
    14     public void testFor2(){
    15         String[] str = new String[]{"AA","BB","DD"};
    16         for(int i = 0;i < str.length;i++){
    17             str[i] = i + "";
    18         }
    19         
    20         for(int i = 0;i < str.length;i++){
    21             System.out.println(str[i]);
    22         }
    23     }

     

     

     

    List接口的实现类之二:LinkedList

    对于频繁的插入、删除元素的操作,建议使用LinkedList,效率较高

     

    List接口的实现类之三:Vector

    Vector大多数操作和ArrayList差不多,但是Vector是线程安全的,当插入、删除频繁的时候,使用LinkedList,Vector总是比ArrayList慢

     

     

     

     

     

    Iterator和ListIterator的区别:

    两者都有next()和hasNext(),可以实现向后遍历,但是ListIterator有previous()和hasPrevious()方法,即可以实现向前遍历

    ListIterator可以定位当前位置,nextIndex()和previous()可以实现

    ListIterator有add()方法,可以向list集合中添加数据

    都可以实现删除操作,但是ListIterator可以实现对对象的修改,set()可以实现,Iterator仅能遍历,不能修改

     

     Set集合不允许包含两个相同的元素,如果试图把两个相同的元素加入到同一个Set集合中,则添加操作失败

    Set集合判断两个对象是否相等不是使用==,而是使用equals()方法

     

    HashSet使用hash算法进行存储集合中的元素,因此有很好的存取和查找功能

    HastSet的一下特点:

      不能保证元素的顺序排列

      HashSet不是线程安全的

      集合元素可以是null

    当向HashSet集合中添加一个元素时候,会调用hashCode()方法得到该对象的hashCode值,根据根据该值决定元素的存放位置

    HashSet判断两个元素相等的的标准,两个对象的hashCode()是否相等,并且equals()方法是否相等

     

    hashCode()方法::

    如果元素的equals()方法返回true,但是他们的hashCode()值不同,hashSet会将他们存放在不同的位置,依然可以添加成功

    对于存放在集合中的对象,对象的类一定要重写equals()和hashCode()方法,以实现对象的相等原则

     

    Set实现类之二:LinkedHashSet

    LinkedHashSset根据元素的hasCode值来决定元素的存储位置,但是它同时使用链表维护次序,这使得元素看起来是有序的

    LinkedHashSet的插入性能要低于HashSet,但在迭代访问Set里面的元素是有很好的性能

    LinkedHashSet不允许元素的重复

     

    Set实现类之三:TreeSset

    TreeSet是SortedSet的实现类,TreeSet可以保证元素处于排序状态

     

    TreeSet两种排序方式:自然排序和定制排序,默认情况下,TreeSet采用自然排序

    排序---自然排序

    自然排序:TreeSet会调用集合元素的compareTo(Object object)方法来比较元素之间的大小关系,然后将元素按升序排列

    如果试图把一个元素添加到TreeSet中,则该对象必须实现Comparable接口

    实现Comparable接口必须实现compareTo(Object object),两个对象即通过这个方法进行比较

    Comparable的典型实现

    BigDecimal、BigInteger以及所有的数值类型对应的包装类型,按对应的数值大小进行比较

    Character:按字符的Unicode值进行比较

    Boolean:true对应的包装类实例大于false包装类对应的实例

    String:按字符对应的Unicode值进行比较

    Date、Time:后面的时间、日期比前面的时间、日期大

    向TreeSet中添加一个元素,只有第一个不需要使用compareTo()方法,后面的都要调用该方法

    因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象

    对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是两个对象通过compareTo方法的返回值相等

    当需要把一个对象放入TreeSet中,重写对象对应的equals方法时候,应保证该方法与compareTo方法有一致的结果

     

     

  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/lzb0803/p/8963131.html
Copyright © 2020-2023  润新知