HashMap的简单了解

HashMap

都知道HashMap是用键值对(key-value)的方式存储数据的,jdk1.7的HashMap是用数组+链表实现的,jdk1.8的HashMap是用数组+链表+红黑树实现的。那么它是怎么做到的呢?为什么又会出现变化呢?

  首先它有一个数组作为主干,然后根据key的哈希值 % 数组.length(对象的哈希值进行一些操作后对数组的长度取余)确定这个键值对应该放在数组的哪个位置上举个栗子:假如key"栗子"的哈希值%数组的长度=1那么我们就把它放在数组下标为1的位置,到这里我个人觉得其实就是跟Hash的用法是一样的。hash表会因为会有对象的hashcode码相同,导致要放在同一个位置上,那HashMap肯定也避免不了这种情况,如果出现了这种情况我们就在这个位置创建一个链表,把后来的数据放在这个链表的第一位,把之前的数据往后顶一顶,(原数据小声bb:现在的新数据都这么恐怖的嘛,一上来就当老大,想当年...)。到这里数据就存好了,接下来是获取。

获取的话还是根据key的哈希值 % table.length获取到存放在数组的下标位置,找到位置后发现,这个位置的数据不止一个啊,哪个才是我要找的啊,然后就开始按着链表的顺序一个一个的对比,找到我们想要的数据。这个时候就延伸出了一个经典的问题"为什么要重写 hashcode 和 equals 方法?"

为什么呢,Hashcode码相同的话会有一个位置上有好多数据的情况,这个时候就要用到equals 来进行比对这个位置上的哪一个数据是我们想要的,如果Hashcode和equals 两个没有保持一致的话是找不到我们想要的数据的。

那什么时候会转为红黑树呢,当链表长度大于等于8,且数组长度大于64的时候会转为红黑树,如果数组长度未到64会首先尝试扩容,如果链表长度低于6,就把红黑树转回到链表。转为红黑树的原因是链表在比对的时候是一个一个的比对,比较麻烦。红黑树的原理和实现我不是太清楚,但是我知道他是一种折半的查询方式,可以减少对比查询的时间。

 

以上内容是根据https://blog.csdn.net/zzti_erlie/article/details/79823187进行的理解总结

 

 

 

posted @ 2021-12-15 10:49  奥特曼阿文  阅读(37)  评论(0)    收藏  举报