1.集合框架
①Collection和Map为最顶层接口
List(存储有序可重复数据)和Set(存储无需不可重复数据)接口都继承Collection接口
List的主要实现类有ArrayList、LinkedList、Vector;Set的主要实现类有HashSet、LinkedHashSet、TreeSet;Map的主要实现类有HashMap、TreeMap、LinkedHashMap、HashTable。
②ArrayList、LinkedList、Vector的适用场景和实现原理:
ArrayList基于数组实现,适用于遍历较多,添加和删除较少的场景。ArrayList默认长度为10,当要存储的的数据和已经存储的数据长度超过了数组的长度时就扩容,如原数组的长度为10,在存储第11个元素的时候就需要扩容,扩容为原长度的1.5倍,即15,当存储第16个元素时也要扩容,扩容为22;
LinkedList内部基于双向链表实现,同时实现了双端队列 Deque 接口,链表节点的存储地址是不连续的,每个存储地址通过指针关联,在查找时需要进行指针遍历节点,所以查找比较慢,而在插入和删除时比较快。
Vector是List接口的一个古老的实现类,实现与ArrayList一致,只是Vector是线程安全的,在每个方法上都添加synchronized
③HashSet是基于HashMap来实现的,用HashMap的key来存储数据。
LinkedHashSet 是 Set 的一个具体实现,其维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。
LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于LinkedHashMap 其内部是基于 Hashmap 实现一样,如果我们需要迭代的顺序为插入顺序或者访问顺序,那么 LinkedHashSet 是需要你首先考虑的。
TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。TreeSet的性能比HashSet差,但是我们在需要排序的时候可以用TreeSet,因为他是自然排序也就是升序。
④HashMap是基于数组和链表实现的,数组的默认长度为16,负载因子为0.75,当存放的数据长度大于length*0.75时则扩容为length*2。数组上存放entry,当entry的hash值相同时则使用链表存放,HashMap 是使用链地址法来解决冲突,当两个对象的hashcode相同时,它们的bucket位置相同,碰撞就会发生。此时,可以将 put 进来的 K- V 对象插入到链表的尾部。对于储存在同一个bucket位置的链表对象,可通过键对象的equals()方法用来找到键值对。
HashTable与HashMap的实现基本一样,只是HashTable是线程安全的,在每个方法上都加了synchronized。
TreeMap的存储结构是红黑树
LinkedHashMap:LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。它继承于HashMap、底层使用哈希表与双向链表来保存所有元素。其基本操作与父类HashMap相似,它通过重写父类相关的方法,来实现自己的链接列表特性。
LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。