Map: 双列数据,存储key - value键值对。
HashMap: 是Map的主要实现类,可以存储null的key和value;线程不安全,效率高。
TreeMap:底层使用红黑树,按添加的key - value对进行排序,所以实现Comparable接口或者重写Compartor的compare()方法。
Hashtable: Map的古老实现类,不能存储null的key - value,线程不安全,现在基本不用。
LinkedHashMap: HashMap的子类,可以按照添加的顺序遍历,因为在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效率高于HashMap。
Properties:常用来处理配置文件。key-value都是String类型。
在jdk8中HashMap是如何存储数据的:
在HashMap中,数据仍然是以数组存放的。在jdk8中,key - value存储单元是Node。
HashMap map = new HashMap(); map.put(key1,value1);
在实例化HashMap(HashMap map = new HashMap())后,底层数组并没有被创建。当我们调用put()方法往里面存数据的时候,底层会创建一个长度为16的数组。
一、调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算后,得到在Node[]数组中的存放位置。
(1)如果此位置没有数据,则数据添加成功。
(2)如果此位置有一个或多个以链表形式存储数据:比较key1和此位置所有数据的哈希值。
①如果key1的哈希值与这个位置上的数据的哈希值都不相同,则key1这对数据添加成功。
②如果key1的哈希值与此位置上的数据有相同的(如key2 - value2):调用key1所在类的equals()方法比较。
Ⅰ如果equals()返回false,则key1这对数据添加成功。
Ⅱ如果equals()返回true,则使用vaule1替换vaule2。
注:同一个位置如果有多个数据,则这些数据是以链表形式存储的,当数组长度 > 64并且单个位置以链表形式存储的数据超过8个时,此位置的数据转化为红黑树的形式存储。 何时扩容:负载因子=0.75时,当 数组容量/数组长度 = 0.75 时,扩容为原来的2倍。



