Java核心篇之HashMap–day6
HashMap是一种键值对的数据结构,以数组与链表的形式(key:value)实现,查询性能和添加性能很好。他是通过将key进行hashcode()映射函数来找到表中对应的位置。
HashMap和Hashtable与LinkedHashMap以及TreeMap的区别:
-
底层都是基于数组和链表来实现的;
-
HashMap是非线程安全的,HashTable是线程安全的,修改数据的时候锁住整个Hashtable。
-
HashMap的键和值都允许有null值存在,而HashTable则不行。
-
HashMap效率比HashTable的要高。
-
初始值大小:
Hashtable:size为11,扩容为:2size+1;
HashMap:size为16,扩容为:2size(2的n次幂) -
Hashtable是基于synchronized关键字,锁住的是整个表,而concurrentHashMap是基于lock操作,这样的目的是保证同步的时候,锁住的不是整个对象。
-
ConcurrentHashMap基于concurrentLevel划分出了多个Segment来对key-value进行存储,从而避免每次锁定整个数组,允许多个线程并发无阻塞的操作集合对象,尽可能地减少并发时的阻塞现象。
-
LinkedHashMap:基本和HashMap实现类似,多了一个链表来维护元素插入的顺序,因此维护的效率会比HashMap略低。但是因为有链表的存在,遍历效率会高于HashMap。
LinkedHashMap和TreeMap
1.LinkedHashMap能够保持记录的插入顺序,用iterator来遍历LinkedHashMap时,先得到的记录是先插入的记录,它包含了HashMap的其他特性。
2.TreeMap能够将它保存的记录根据键进行排序,默认为升序。用iterator进行遍历的时候,得到的记录都是排好序的。其键和值都不能为空。
3.HashSet是根据HashMap来实现的,TreeSet是根据TreeMap来实现的,只不过set用的是map的key;map的key和set的共性就是集合的唯一性,其中TreeMap多了一个排序的功能。
HashSet,TreeSet,LinkedHashSet的区别;
1.HashSet类似于HashMap,至多只能有一个值为null,存入的元素是无序的,并且不能重复;
2.LinkedHashSet至多只能有一个值为null,元素严格按照放入的顺序排列
3.TreeSet不能有null值,根据元素的自然顺序进行排序