HashMap的实现原理:
由Map接口定义的集合又被叫做是查找表,将key值作为value的索引,以key-value键值对的方式进行数据存储,其中key值不可重复; 而Map有多种实现类,以哈希表(hashtable)作为底层数据结构实现的,我们叫做HashMap;因此HashMap的实现原理即哈希表数据结构的实现原理
基于哈希表(数组+链表+二叉树(红黑树))
默认的加载因子为0.75,默认数组大小为16
把对象存储到哈希表中,如何存储?
把key通过hash()方法计算hash的值,然后用这个hash值对数组长度(默认是16)取模,来决定对key对象再数组中存储的位置,当这个位置有多个对象时,以链表结构存储,JDK1.8后,当链表长度大于8时,链表转换为红黑树结构存储,这样的目的是为了取值更快,存储的数据量越大,性能的表现越明显。
扩充原理
当数组的容量超过75%时,数组需要进行扩充,每次扩充1倍,扩充次数过多,会影响性能,每次扩充表示哈希表会重新散列(重新计算每个位置的存储位置),我们尽量在开发中减少扩充次数带来的性能问题。
线程不安全,适合在单线程里使用
总结:
hash表就是通过传入的键值对,通过hash算法指向一个连续的存储空间(数组存储),将键值对存入数组;对于指向相同的存储空间的hash值,再以链表方式存储;这样hashmap不仅具有了数据查询快速的特性,同时有了链表方便插入、删除的特性;因此hashMap对于数据的存储查询具有非常好的特性;