zoukankan      html  css  js  c++  java
  • 集合(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方法有一致的结果

     

     

  • 相关阅读:
    洛谷P3799 妖梦拼木棒
    bzoj1008 [HNOI2008]越狱
    洛谷P3414 SAC#1
    洛谷P1078 文化之旅
    bzoj1053 [HAOI2007]反素数ant
    洛谷P1588 丢失的牛
    bzoj1085 [SCOI2005]骑士精神
    noip2016 蚯蚓
    noip2016 换教室
    html笔记03:表单
  • 原文地址:https://www.cnblogs.com/lzb0803/p/8963131.html
Copyright © 2011-2022 走看看