(集合一)集合

一、集合与数组

    相同点: 都可存储一系列数据,即都为数据的容器,存储Object类型时存储对象都为引用类型

    不同点:1) 数组可存储基本数据类型,集合不可以

                     2)数组长度为定值,数组内数据数量未知时不宜使用;集合长度可变,较数组更为灵活,适用性更广。

    注:同一数组可存储不同数据类型的数组,例:Object[] arr={"String",new Integer(1)};

    集合框架结构图:

二、存储对象引用

    元素在内部索引过程:

三、Collection接口的类别及其方法测试 

    子接口:

            ①List(interface)

                a.元素有序可重复

                b.通过索引访问指定位置的集合元素,默认的索引设置为按元素的添加顺序设置(索引为0~size()-1)

                实现类(导util包):

            ArrayList:基于列表的数据结构,对象位置连续,在增删改查操作中,数据量大的情况下ArrayList对于查操作较LinkedList更为方便,因为ArrayList在增删操作时需要移动数据,而在查(get、set)数据方面速度很快。

              LinkedList:基于双链表的数据结构,对象位置不连续,在增删改查中,数据量大的情况下LinkedList对于增删操作较ArrayList更为方便,因为LinkedList对象使用类似指针(java中没有指针)的索引进行连接,在查数据时需要根据索引一步一步查,而在增删(add、remove)方面速度很快。

               Vector:该类用法与List用法差不多,在使用上,Vector是线程安全的,ArrayList是线程不安全的。不过即使为保证List集合线程安全,也不推荐使用。(安全隐患:当多用户同时操作时造成的线程问题,操作系统详解。)

                图示:

            ②Set(interface)

                a.无序

                b.不重复

                实现类:

                HashSet:在存储元素时,使用hash算法来确定元素在内存中的存储位置,由于不重复,所以在存储时,先调用equals方法进行比较。当集合内元素过多时只调用equals方法效率极低。为了提高存储、查询效率,需要我们重写hashCode方法,使每个元素对象通过该方法返回一个int值即元素在内存中的区域位置,如果此区域内的对应位置没有元素,说明可以存储或查询时返回null。如果对应位置有元素,则调用equals方法进行比较,equals为true时,说明重复,不能存储,或查询时查到;equals为false时说明未重复,可以存入int值对应的一个链表中,或查询时返回未找到。重写equals方法时有必要重写hashCode方法。equals返回true时,hashCode返回值应该相同,equals为false时hashCode值不一定不相同(hashCode值不相同时可以提高检索效率)。hashCode值相同时,equals方法返回值不一定相同。hashCode值不同时,equals一定不同。没重写qequals方法时调用则比较的是地址,重写后比较的是重写方法内的方法。    *注:重写hashCode时,尽可能让所有属性都参与运算。底层实际上为HashMap+操作,作为Map中的key进行存储

                LinkedHashSet:是HashSet的子类,使用hash算法存储元素,有序,使用链表来维护元素的次序,元素不可重复,无下标,不能使用下标提取元素,在插入操作中HashSet性能高于LinkedHashSet,在遍历操作上LinkedHashSet性能高于HashSet. 。

                TreeSet:内部使用二叉树维护元素次序,不重复,支持两种排序,自然排序与自定义排序,默认情况下为自然排序

          ③Queue(interface)

                a.FIFO原则

                b.toString方法从队首打印到队尾

                c.下属接口Deque(interface):双端队列

                d.Stack栈:FILO原则,将双端队列的一端进行严格限制,严禁进出操作

三、Map接口(散列表接口)的类别及其方法测试

    Map是除Collection父接口之外的另一个父接口,用于保存具有映射关系的数据,这样的数据称之为key-value键值对。key可看成为value的索引。例:钥匙-锁,一把钥匙开一把锁,一把锁可以有多把钥匙,在内存中key-value散列存放。底层使用的是数组与链表来存放数据,数组是hash表,是通过Map的key的hashCode的返回值来定位,数组的每个元素都对应一个链表(单向),数组元素我们称之为bucket(桶),每一个桶对应一个单向链表,链表里存储的是Entry对象(Entry对象封装的是一对key-value),为了避免因把数据存于散列桶对应的链表中时的查询效率低,我们应该重写key对象的hashCode方法。

    加载因子:HashMap在构造时,初始的容量为16,加载因子为0.75,也就是说,当存储数据时,如果桶的使用数量为12时,此时12/16=0.75,就会进行扩容

    特点:①key与value也必须是引用类型的数据

                ②key在Map集合中不允许重复

                ③key可以为null

                ④key与value之间为单向一对一关系,通过指定的key总能找到唯一确定的value

    实现类:

                    HashMap:使用Hash算法存储key-value键值对。key无序且唯一,value可重复。

                    TreeMap:使用二叉树维护key-value次序,也就是说放入TreeMap集合中的key的对象的类型必须实现comparable。

                    HashTable:比较古老,线程安全,效率低,key与value不能使用null,否则抛出异常

                    LinkedHashMap:底层使用链表来维护key-value的次序。

                    Properties:以key-value形式存储信息,用法与HashMap相同,但不需要使用泛型,父类型是HashTable