Java集合总结
Collection(单列集合)
List接口特点:元素存取有序 有索引 可重复
ArrayList
有序 有索引 可重复
底层使用数组,查询快增删慢
线程不安全
Vector
有序 有索引 可重复
底层使用数组,查询快增删慢
线程安全,效率低
LinkedList
有序 有索引 可重复
底层使用双向循环链表结构,查询慢,增删快,add()和remove()方法快
提供了大量特有的首尾操作的方法
线程不安全
Set接口的特点:元素存取无序(按照其内部的特有顺序) 无索引 不可重复
HashSet
排列无序,元素无索引 不可重复
底层使用Hash表(JDK1.8中数组+链表/红黑树,当一个链表存储元素超过8个后,就会转为红黑树)实现,具有良好的存取和查找性能
内部是HashMap
TreeSet
排列无序,元素无索引 不可重复
底层使用二叉树实现
排序存储
内部是TreeMap的SortedSet
LinkedHashSet
排列有序,元素无索引 不可重复
底层使用 哈希表(JDK1.8中数组+链表/红黑树)+链表
内部是LinkedHashMap
Queue
在两端出入的list,也可以用数组或链表实现
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Map(双列集合)特点:键值对一一对应,键不能重复 值能重复
HashMap
键不可重复,值可重复
底层使用 哈希表(数组+链表/红黑树,当一个链表存储元素超过8个后,就会转为红黑树)
线程不安全
key和value都可以为null
HashMap基于Hash算法实现的,我们通过put(key,value)存储,get(key)来获取,当传入key时,HashMap会根据key.hashCode()计算出hash值,根据hash值将value保存到bucket中,当计算出的hash值相同时,我们称之为hash值冲突,HashMap的做法是用链表和红黑树存储相同hash值的value。当hash冲突个数较少时(8),使用链表否则使用红黑树
HashTable
键不可重复,值可重复
底层Hash表
线程安全
key和value都不能为null
是遗留类,基本不用
TreeMap
键不可重复,值可重复
底层二叉树
能根据键排序,key必须实现Comparable接口或在构造TreeMap时传入自定义的Comparator
SynchronizedMap
线程安全
ConcurrentHashMap
线程安全
由一个个segment(分段锁)组成,相当于一个segment数组,通过集成ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,只要保证每一个segment是线程安全的,那么整个 ConcurrentHashMap就是线程安全的