List
有序集合
ArrayList
结构:采用数组结构,查询性能优秀(数组将元素在内存中连续存放,链表非顺序存放),插入以及删除性能较差(插入以及删除都会设计到目标元素后的元素位置移动,而链表只需要修改指向下标)
扩容:
- 创建一个容量为原数组容量1.5倍的新数组,并将原数组复制到新数组
- 新添加元素插入到新数组最后一位
- 原数组被GC处理
ArrayList与数组的区别?
- 数组需要指定长度,ArrayList不用,默认10
- ArrayList可以动态扩容,1.5倍
LinkedList
结构:采用双链表结构,插入删除性能优秀
无需扩容
Vector
线程安全,扩容时增加一倍
Set
无序集合,用于排重
TreeSet
支持自然顺序访问,插入删除性能低效
HashSet
利用哈希算法,插入删除性能优秀,不保证有序
LinkedHashSet
内部维护一个记录插入顺序的双向链表,所以既保证有序,又保证插入删除的性能,但是性能低于HashSet,因为维护链表有额外开销
Queue
队列结构,先入先出、后入后出,有优先级队列,可用于优先级处理场景
Map
HashMap
结构:采用数组+链表的数据结构,在jdk 1.8中,当链表长度超过8改变结构为红黑树
特性:put时,根据hash函数(key的hash值 异或 (数组长度-1))得到数组下标,确定放入某一个桶中,当桶中有元素时,根据equals挨个判断是否存在相同key值,存在的话则覆盖,不存在则新增
高并发情况下,jdk 1.7 hashmap会出现环形链表死循环情况,1.8采用头插法解决
支持null键值
扩容:与数组一样,扩容时创建新数组,然后将元素重新进行hash排序
HashTable
本身同步,不支持null键值
TreeMap
基于红黑树提供顺序访问
LinkHashMap
与hashmap类似,内部额外提供双向链表,提供顺序访问