HashMap是最常用的Map接口的实现类型,通过存储键值对的方式,来表示两个集合的映射关系。
一、构造方法
HashMap有四个构造方法
-
HashMap() //无参构造方法
-
HashMap(int initialCapacity) //指定初始容量的构造方法
-
HashMap(int initialCapacity, float loadFactor) //指定初始容量和负载因子
-
HashMap(Map<? extends K,? extends V> m) //指定集合,转化为HashMap
HashMap默认初始容量为16,HashMap的扩容十分耗时,如果能提前知道容量尽量提前设置。扩容时会将容量翻倍。
二、数据结构
HashMap的主要数据结构是哈希表,用“拉链法”实现。
哈希表是一组链表的数组。以内置静态类Entry作为结点,Entry的属性有 hash,key,value,next
通过Entry.next将所有Entry连接成链表
哈希表通过类型K的内置函数hashCode(),根据这个函数和容量len,可以直接确定查找值所在位置,而不需要一个个比较。这样就Entry所在的位置,直接找到数据,提升效率。
三、函数实现
1.get(K key)
首先要寻找key的Entry,计算key.hashCode()%len,得到index,那么就在Entry[index]所在的链表中找到对应key相等的Entry,然后返回Entry中的value即可,如果没找到则返回null
2.put(K key,V value)
计算key.hashCode()%len,得到index,遍历Entry[index]如果找到对应的key,替换上新的value并返回原来的value。否则调用addEntry(hash,key,value,index),即给链表添加新的Entry结点
三、后记
在Jdk1.8中,引用了红黑树,进一步提高了HashMap的效率,HashMap的实现方式做了一些改变,数据结构的存储由数组+链表的方式,变化为数组+链表+红黑树的存储方式,但是基本思想没有改变