Map实现类
Java集合系列
一. HashMap
-
数据结构:数组+链表
-
特点:
- null可以作为值和键,但是键只允许一个null,而值可以有多个null元素。
- 键不能重复
- 无法保证元素的存入顺序
- 桶
-
构造方法:
-
HashMap()
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。16*0.75=12
-
HashMap(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
-
HashMap(int initialCapacity, float loadFactor)
构造一个带指定初始容量和加载因子的空 HashMap。
-
-
注意:
- 翻倍扩容,扩容后可能会出现rehash
- 1.8之后,当链表的长度超过8时,将HashMap底层结构转为红黑树的结构。当链表的长度小于6时,再从红黑树的结构转回来
二. Hashtable
从JDK1.2开始,才让Hashtable作为Map的实现类
-
特点:
- 任何非 null 对象都可以用作键或值,对于null的键和值,HashTable会抛出空指针异常。(有别于HashMap)
-
构造方法:
-
Hashtable()
用默认的初始容量 (11) 和加载因子 (0.75) 构造一个新的空哈希表
-
-
HashMap和Hashtable的区别:
- HashMap允许键存在一个null,值允许有多个null,而对于Hashtable来说,键值都不允许为null,否则运行会抛出空指针异常;
- 默认大小,HashMap为16,Hashtable为11
- HashMap线程不安全的,效率高;Hashtable线程安全的,效率低。
三. LinkedHashMap
是HashMap的子类,可以确保元素存储的顺序;底层其实是维护了一个双重链表;
-
构造方法:
-
LinkedHashMap()
构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。
-
-
注意:
- 如果再使用map时,需要保证元素放入的顺序,这时可以使用LinkedHashMap,但效率低于HashMap。