java里有Collection跟Map,List、Queue、Set是继承于Collection,Map是继承AbstractMap
Collection实现了Iterator,可以执行迭代器遍历
List常用的有ArrayList(底层是数组,排序有序,随机查询快,增删慢,线程不安全,扩容为1.5倍+1)、Vector(底层是数组,线程安全,扩容为2倍)、LinkedList(底层是双向循环链表,增删快,读写较慢,线程不安全)
Queue,队列,提供两端的操作,实际上跟List差不多
Set,存放不重复的数据,主要有HashSet(内部使用HashMap实现,存取速度快,排序无序)、TreeSet(采用二叉树原理,内部是TreeMap的SortedSet,存入的对象可实现Comparable支持排序存储,不可重复)、LinkedHashSet(内部是LinkedHashMap)
备注:Set实际上都是对Map 的封装
Map,有HashMap、HashTable、TreeMap
HashMap(数组+链表+红黑树):键不可重复,值可以重复,线程不安全,底层采用hash表实现,线程不安全,可使用ConcurrentHashMap获得线程安全的能力。jdk1.8后,数组的元素改为链表或红黑树,当链表长度超过8就变为红黑树,查询的时间复杂度从o(n)变为o(logN)。
-散列表采用扰动函数,利用存入对象的hashcode右移16位后与原hashcode做异或运算,混合原hashcode的高低位,增加随机性。
-初始化容量,寻找传入容量的2的倍数的最小值
-负载因子,默认为0.75f,当散列表超过四分之三会扩容,减少hash碰撞,如果需要更高性能,可以空间换时间,调小负载因子以达到减少碰撞
-扩容元素拆分,当数组长度不足,会将元素拆分到新的数组,jdk1.8后拆分后不需要重新计算
用到的红黑树是一种平衡二叉搜索树(左子树小于右子树;左右子树高度不超过1,切左右子树都是平衡二叉树),相对于AVL树,红黑树是一种弱平衡(所有节点都是红色或黑色,根节点是黑色,所有叶子都是黑色(NIF),节点到每个叶子所经过的节点都包含相同数量黑色节点)
红黑树在插入的时候通过节点旋转,左旋、右旋,来让树更加平衡
查找的时候递归查询,左子树比右子树小
插入,按照查找的方式,找到空的子树,作为红色节点插入,然后根据父节点、叔父节点的颜色、位置进行不同的调整
删除是最复杂的,根据删除节点有多少NIF节点处理
hashtable:继承于Dictionary,线程安全、key和value都不能为null,并发性能不如ConcurrentHashMap
ConCurrentHashMap:实现思路与HashMap差不多,使用了分段锁来保证线程安全。数组元素采用Segment段组成,Segment集成了ReentrantLock。concurrencyLevel默认是16,代表默认有16个Segment,理论上支持16个线程并发写,concurrencyLevel初始化后不可变,即ConcurrentHashMap不能扩容