对于
Map
的遍历,建议使用
entrySet
迭代器方式,在进行大量级数据时,效率会高很多。
Hashtable:
?线程安全,其使用在操作方法上添加synchronized关键字的方法实现,效率较差,key和value不允许为null,推荐使用ConcurrentHashMap替代使用。
HashMap:
线程不安全,其底层实现是数组加单向链表的方式实现,当链表数据过多(默认8个)且数组大小也超过规定值时(默认64个),会转换为红黑树,如果链表长度达到一定长度,而数组大小没有达到,则会先对数组进行扩容(默认扩大两倍)。其主要逻辑是,通过key的hashcode计算应该放在数组的哪个位置上,如果该位置无数据,则直接存放,如果有数据,则与数据进行equals比较,如果一样则覆盖,如果不一样,则追加到链表尾部。这样在查找数据时,可以通过计算hashcode确定其数组位置再遍历链表进行查找。key和value允许为null。
LinkedHashMap:
线程不安全,底层由双向链表实现,保证了插入顺序和迭代顺序的一致,允许key和value设置为null且不影响迭代,要求迭代顺序且查找要求较少的情况下推荐使用。
WeakHashMap:
线程不安全,弱引用版本的HashMap, WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key对应的键值对。内存有压力且数据允许一定的丢失情况发生时可以使用。
TreeMap:
线程不安全,底层由红黑树实现,保证了数据的有序性。key不可以为null。
IdentifyHashMap:
线程不安全,HashMap的key判断是否相等是判断其hashcode和equals,该集合是要求其引用指向完全相等才判断两者相等,即指向同一对象时,才是相等覆盖其value。
ConcurrentHashMap:
线程安全,采取分段锁技术,在jdk1.8后,分段锁通过锁住操作的数据的头结点实现,即锁住其对于数组位置的单向链表的头结点,性能相比Hashtable更好,推荐使用。
ConcurrentSkipListMap:
线程安全,相比ConcurrentHashMap可以对数据进行排序,基于跳表实现。
|