Java语言进阶-集合-Map接口

Map接口

  • Map:双列数据,存储Key-Value对的数据
    • HashMap:Map的主要实现类,线程不安全,效率高,可以存储null值,底层是数组+链表+红黑树
      • LinkedHashMap:线程安全的实现类,效率低。保证在遍历map元素时,可以按照添加的顺序实现遍历。因为他自带一对指针,适合做频繁的遍历
    • TreeMap:保证按照添加的Key-value对进行排序,实现排序遍历。底层是红黑树
    • Hashtable:古老的实现类
      • Properties:常用来处理配置文件
HashMap的底层

HashMap map = mew HashMap();

在实例化以后,底层创建了一维数组Node[] table.

map.put(key1,value2);

第一次调用put时,给数组添加长度。(懒汉式加载)

首先,调用key1所在类的hashCode()计算key1的hash值,此hash值经过某种算法计算后,得到node数组中的存放位置。

如果此位置上的数据为空,添加key1-value2.

如果此位置上的数据不为空,则比对哈希值是否相同,如果不相同则以链表的形式在这个位置上存储数据;如果相同则比较字面值是否相同,如果相同则使用value1替换原有数据;如果不相同则以链表的形式在这个位置上存储数据。

当数组的某一个索引位置上的以链表形式存储的元素个数大于8且数组长度大于64,此时索引位置上的链表转换为红黑树存储。

Java语言进阶-集合-Map接口
默认的扩容是扩容至原来长度的两倍,进行数据复制。

HashMap和Hashtable的异同

相同点:都实现了Map接口,都是无序+不可重复

不同点:Hashtable线程安全,HashMap线程不安全;hashTable继承Dictionary,HashMap继承AbstractMap;Hashtable的键值不能为null,hashMap键值可以为null;HashMap在单线程下效率高,HashTable在单线程下效率低
为null;HashMap在单线程下效率高,HashTable在单线程下效率低