HashMap集合

简介: HashMap集合

公众号merlinsea


  • HashMap
  • 底层是由数组+链表+红黑树(jdk8开始)实现,是线程不安全的,初始容量是16,默认装载因子是0.75,当hashMap实际存储的位置为16*0.75=12时,如果再来一个新的位置存储元素,那么就会发生扩容,扩容的目的在于减少hash碰撞,hashMap采用链表法解决hash碰撞问题。源码中是先插入再判断是否需要扩容!!
  • 数组作用:数组中的每个位置相当于一个槽,可以根据keyhash&arr.length-1得到这个key应该放在哪个槽中。数组中的每一个槽用于存放hash值相同的key值。
  • 链表作用:用于解决hash冲突,所有映射到同一个槽的元素都产生了hash冲突,通过链地址法解决hash冲突问题。
  • 红黑树作用:当链表的个数大于8的时候,会发生链转树,目的在于把原来在链表中O(n)的查询效率降低为O(logn)
  • 为什么不使用二叉树?答:因为二叉树在某些情况下可能会退化为单链表,就不满足logn的查询效率!!

640.jpg

  • Put(key,val)的过程:
  • 判断table是否为空,为空则需要进行扩容
  • 否则通过hash&(table.length-1)确定table中的槽位
  • 如果槽位为空,直接插入。
  • 否则判断是否是红黑树节点,是的话按红黑树的方式插入
  • 否则则是链表,则需要一个个往下找,如果找到key相同的就替换(替换不会引发链表长度增加就不会发生链转树),否则采用尾插法(还需要判别是否会发生链转树)

640.jpg640.png



相关文章
|
2月前
|
存储 Java 容器
HashMap 的基本操作【集合容器知识回顾 ⑤】
本文介绍了HashMap的基本操作,包括创建对象、添加、获取、删除和替换元素、获取所有key的集合、遍历HashMap,以及如何存储自定义类型键值对,并强调了当使用自定义对象作为键时需要重写equals和hashCode方法以确保正确的行为。
HashMap 的基本操作【集合容器知识回顾 ⑤】
|
3月前
|
存储
|
3月前
|
存储 Java
HashMap与LinkedHashMap类型集合
【8月更文挑战第4天】`HashMap` 是基于哈希表实现的键值对存储结构,提供快速的查找、插入和删除操作,但不保证元素顺序。适用于不关心顺序且需高效操作的场景。 `LinkedHashMap` 继承自 `HashMap`,保持了元素的插入或访问顺序。适合需要按特定顺序遍历元素的应用,如按添加顺序显示购物车商品。其操作效率与 `HashMap` 相近。
|
5月前
|
Java
Java集合-----HashMap实例
Java集合-----HashMap实例
42 5
|
存储 安全 Java
Java集合Map之HashMap常用操作
在我看来 , 链表是为了解决hash碰撞使用的一种方法 : 拉线法 , 而红黑树是为了解决"拉的这个线"(链表存储的元素太多)过长的话元素遍历慢的问题
61 2
|
6月前
|
存储 缓存 Rust
Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用
Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用
946 0
|
6月前
|
存储 算法 安全
认真学习Java集合之HashMap的实现原理
认真学习Java集合之HashMap的实现原理
70 0
认真学习Java集合之HashMap的实现原理
|
11月前
|
安全 Java 应用服务中间件
史上最全的Java容器集合之HashMap(源码解读)(二)
史上最全的Java容器集合之HashMap(源码解读)(二)
51 0
史上最全的Java容器集合之HashMap(源码解读)(二)
|
11月前
|
存储 Java 索引
史上最全的Java容器集合之HashMap(源码解读)(一)
史上最全的Java容器集合之HashMap(源码解读)(一)
56 0
|
存储 算法 Java
java集合框架Map之HashMap底层原理解析
阈值(threshold) = 负载因子(loadFactor) x 容量(capacity) , 当HashMap中的table数组(桶)的长度 >= 阈值的时候就会自动触发扩容机制
66 0