梳理Java中关于集合的知识
常见接口简介
-
List 有序、可重复
ArrayList 查改速度快,初始大小10,扩容一次是原来的1.5倍。
LinkedList 增删速度快,双向链表结构。
Vector 线程安全,初始大小10,扩容一次是原来的2倍。其他集合可通过
java.util.Collections
类的静态方法如synchronizedList
、synchronizedSet
等实现线程安全。 -
Set 无序、不可重复
HashSet 底层就是一个HashMap的实例
LinkedHashSet 相比于HashSet其保存了记录的插入顺序。
TreeSet 二叉树排序树
-
Map
HashMap key和value允许null值的存在,key不许重复,value允许重复。初始大小是16。
LinkedHashMap 相比于HashMap其保存了记录的插入顺序。
TreeMap 实现SortMap接口,可根据key进行排序。不允许key为null,非同步的。
Hashtable 在JDK1.0版本就已经存在了,线程安全效率较低。
Properties 是Hashtable的子类,常用于加载配置文件。
ConcurrentHashMap 线程安全,并且锁分离。
为何Map接口不继承Collection接口?
Map是集合框架的一部分,但是Map与List、Set等结构不同,所以无需继承Collection接口。
HashMap是如何工作的?
首先根据hashCode()
方法获取hash
值,根据hash
值计算出在应放置在数据的位置,假如该位置为空,那么直接将其插入;假如该位置不为空,检查其equals(Object obj)
方法,如果返回true,将其抛弃,反之插入。hash
值若一样,将以链表的形式存放在数组中。
假设hash
值计算相同,将以链表的形式存储。JDK7和JDK8有点不同,JDK7是将新的值追加在链表上,JDK8是将链表追加在新的值上。
Collections类是什么?
其位于java.util
包下,它是一个工具类,有关于List、Set、Map等操作的静态方法。如:排序、交换、反转、复制、最大值、最小值等。
HashMap在多线程时可能会死循环
在并发情形下,Rehash会造成元素间形成一个循环链表。并发情形下推荐使用 ConcurrentHashMap。