目录
首先来一份集合框架图
一、List
1.ArrayList(数组)
1)初始化
无参数
jdk1.7,默认容量为10;
jdk1.8,初始化为空数组,add数据时,初始化容量为10。
有参数,根据设置的容量值进行初始化。
2)原理,add时,先判断是否扩容,再存储值,扩容过程有对数组进行复制、移动,代价比较高。
2.Vector(数组实现,线程同步)
同Arraylist,初始化容量默认为10,add和get时,使用synchronzied同步锁,所以线程安全。
3.LinkedList(链表)
使用链表结构,单个元素通过next、prev两个属性来实现双向链表结构,适合数据的动态插入和删除,可以当做堆栈、队列和双向队列使用。
二、Set
对象的相等性本质是根据对象的hashcode值(java是依据对象的内存地址计算出的此序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆写Object的hashcode方法和equals方法。
1.HashSet(HashMap)
1)线程不安全
2)原理,HashSet底层就是一个HashMap结构,add的值,存的是HashMap的key,而对应的值(value)是固定的Object。
2.TreeSet(TreeMap)
1)线程不安全
2)原理,TreeSet底层就是一个TreeMap结构,即红黑树结构。add的值,存的是TreeMap的key,而对应的值(value)是固定的Object。
3.LinkedHashSet(HashSet + LinkedHashMap)
1)线程不安全
2)原理,LinkedHashSet底层就是一个LinkedHashMap结构,即HashMap+双向链表结构。add的值,存的是LinkedHashMap的key,而对应的值(value)是固定的Object。
三、Map
HashTable、HashMap、ConcurrentHashMap的内容比较多,请参考文章:《分析HashTable,HashMap,ConcurrentHashMap的结构、初始化及扩容机制》。
1.TreeMap(可排序)
1)线程不安全
2)结构:红黑树,单个Entry<k,v>就代表红黑树的一个节点。
3)初始化
无参数,默认按键的大小进行升序排序;
有参数,可自定义比较器,按比较器规则进行排序。
4)原理,put时,从根节点进行比较,基于红黑树原理,先找到位置存储,然后再通过fixAfterInsertion方法调整树结构(平衡、颜色等),使其满足红黑树条件。
2.LinkedHashMap(记录插入顺序)
1)线程不安全
2)结构:HashMap + 双向链表
3)原理,LinkedHashMap继承自HashMap,所以底层结构与HashMap结构一致,put方法调的就是HashMap的put方法,get方法做了复写。相比于HashMap,LinkedHashMap额外维护一个双向链表,即在原有的Entery<k,v>结构中,增加了before、after两个属性,用于记录插入顺序,其头结点为head,注意,维护的双向链表并不是重新创建一份包含before、after的Entry<k,v>数据,只是从另一个维度(双向链)来看LinkedHashMap的数据结构,其本质仍是HashMap。用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
以上就是本篇的全部内容,如有错误,欢迎指正!