13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

作为Java开发,知道HashMap底层存储原理总不会害你

概念

存储的优点

HashMap存储元素的过程

首先将k、v封装到Node对象当中(节点)

创新互联公司是一家集网站建设,邹城企业网站建设,邹城品牌网站建设,网站定制,邹城网站建设报价,网络营销,网络优化,邹城网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

调用k的hasnCode()方法取出hash值;通过hashcode值和数组长度取模得到元素存储的下标

此时分为两种情况

HashMap取值的实现

扩容

HashMap中的扩容是在元素插入之前进行的扩容还是元素插入之后进行的扩容

在 JDK1.7中是在元素插入 前 进行的扩容,在JDK1.8 中是先加入元素 后 再判断是否进行扩容

存储元素超过阈值一定会进行扩容吗

在 JDK1.7 中不一定,只有存储元素超过阈值并且当前存储位置不为null,才会进行扩容,在 JDK1.8 中会进行扩容

HashMap和HashTable区别

线程方面

HashMap中的hashcode怎么生成

调用对象key的hashCode方法,再对这个hashcode方法进行一些右移以及异或运算(使的hashCode的高位和低位都参与到运算中);通过右移和异或运算可以使hashMap的散列化更强,提高hashMap的get方法的效率

为什么使用HashCode

HashCode的存在主要是为了查找的快捷性, HashCode是用来在散列存储结构中确定对象的存储地址的 ( 用hashcode来代表对象在hash表中的位置 ) , hashCode存在的重要的原因之一就是在HashMap(HashSet其实就是HashMap)中使用(其实Object类的hashCode方法注释已经说明了),HashMap之所以速度 快 ,因为他使用的是 散列表 ,根据key的hashcode值生成数组下标(通过内存地址直接查找,不需要判断,但是需要多出很多内存,相当于以空间换时间)

equals方法和hashcode的关系

归纳总结:

key为null怎么办

key为null的时候,只会放在hashMap的0位置(即key的hashCode为0,对数组长度取余后的下标也是0),不会有链表 在HashMap源码中对put方法对null做了处理,key为null的判断后进入putForNullKey(V value)这个方法,李里面for循环是在talbe[0]链表 中查找key为null的元素,如果找到,则将value重新赋值给这个元素的value,并返回原来的value。如果没找到则将这个元素添加到talbe[0]链表的表头

 
 
 
 
  1. /**
  2.  * HashMap的put方法
  3.  */
  4. public V put(K key, V value) {
  5.     if (table == EMPTY_TABLE) {
  6.         inflateTable(threshold);
  7.     }
  8.     // key为null调用putForNullKey(value)
  9.     if (key == null) return putForNullKey(value);
  10.     int hash = hash(key);
  11.     int i = indexFor(hash, table.length);
  12.     for (Entry e = table[i]; e != null; e = e.next) {
  13.         Object k;
  14.         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  15.             V oldValue = e.value;
  16.             e.value = value;
  17.             e.recordAccess(this);
  18.             return oldValue;
  19.         }
  20.     }
  21.     modCount++;
  22.     addEntry(hash, key, value, i);
  23.     return null;
  24. }
  25. /**
  26.  * Offloaded version of put for null keys
  27.  */
  28. private V putForNullKey(V value) {
  29.     // for循环处理key为空的情况
  30.     for (Entry e = table[0]; e != null; e = e.next) {
  31.         if (e.key == null) {
  32.             V oldValue = e.value;
  33.             e.value = value;
  34.             e.recordAccess(this);
  35.             return oldValue;
  36.         }
  37.     }
  38.     modCount++;
  39.     addEntry(0, null, value, 0);
  40.     return null;
  41. }

网站题目:作为Java开发,知道HashMap底层存储原理总不会害你
文章分享:http://cdbrznjsb.com/article/dpdgcci.html

其他资讯

让你的专属顾问为你服务