HashMap

* 1、HashMap 实现了 Map 接口
* 2、HashMap 内部采用 哈希表 来存储 映射项
* 3、从 JDK 1.8 开始 HashMap 内部采用 数组 + 链表 + 树 来实现 哈希表
* 4、对于 HashMap 来说,允许 key 为 null,允许 value 为 null
* 5、HashMap中存放的是 键值对(映射项)
* 6、HashMap中的key不可重复,value可以重复
JDK1.8HashMap如何实现哈希表
使用一个Entry数组来存放Entry,Entry就是一对键值对的节点,数组的初始长度是16,然后存放的键值对根据哈希算法得到哈希值,然后找到对应的桶里,如果一个桶里没有其他节点,那么直接放置,如果桶里有其他的节点,那么进行比较,如果哈希值一样,继续通过重写的equals来判断他们的键是否一样,如果一样那么把原来的键值对替换,如果不相等,那么进行节点连接,如果链表长度超过了8,那么转成红黑树来存储
当调用put方法时,HashMap如何判断键已存在
首先先进行一个哈希算法得到哈希值,根据哈希值找到数组里对应的桶,然后在桶中如果有节点存在,那么再判断他们的地址是否相同,如果地址相同了,那么再来根据equals来判断他们里面的键的内容是否相等,如果相等则键已存在
HashMap<K,V>泛型类创建的对象称作散列映射
HashMap泛型实现泛型接口Map
HashMap对象采用散列表的数据结构存储数据,习惯上称HashMap<K,V>对象为散列映射
散列表也就是哈希表
散列映射用于存储健/值对,值与健的关系是:一个值对应一个健,不允许两个值对应一个健,如果出现两个值对应同一个健,那么先前的键值对会被替换
JDK1.8中HashMap与JDK1.7中有很多地方不一样
1、1.8中引入了红黑树,而1.7中没有
2、1.8中元素是插在链表的尾部,而1.7中新元素是插在链表的头部
3、扩容的时候,1.8中不会出现死循环,而1.7中容易出现死循环,而且链表不会倒置
HashMap计算哈希值

浙公网安备 33010602011771号