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



目录
打赏
0
0
0
0
297
分享
相关文章
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
74 3
HashMap 的基本操作【集合容器知识回顾 ⑤】
本文介绍了HashMap的基本操作,包括创建对象、添加、获取、删除和替换元素、获取所有key的集合、遍历HashMap,以及如何存储自定义类型键值对,并强调了当使用自定义对象作为键时需要重写equals和hashCode方法以确保正确的行为。
HashMap 的基本操作【集合容器知识回顾 ⑤】
【Java集合类面试八】、 介绍一下HashMap底层的实现原理
HashMap基于hash算法,通过put和get方法存储和获取对象,自动调整容量,并在碰撞时用链表或红黑树组织元素以优化性能。
【Java集合类面试九】、介绍一下HashMap的扩容机制
HashMap的扩容机制包括初始容量16,以2的次方进行扩充,使用负载因子0.75判断是否扩容,以及链表长度达到阈值时转换为红黑树,以优化性能。
【Java集合类面试九】、介绍一下HashMap的扩容机制
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
【Java集合类面试十五】、说一说HashMap和HashTable的区别
HashMap和Hashtable的主要区别在于Hashtable是线程安全的,不允许null键和值,而HashMap是非线程安全的,允许null键和值。
【Java集合类面试十三】、HashMap如何实现线程安全?
实现HashMap线程安全的方法包括使用Hashtable类、ConcurrentHashMap,或通过Collections工具类将HashMap包装成线程安全的Map。
【Java集合类面试十一】、HashMap为什么用红黑树而不用B树?
HashMap选择使用红黑树而非B树,是因为红黑树在内存中实现简单,节点更小,占用内存少,且在插入、删除和查找操作上提供更好的平衡性能。
【Java集合类面试十六】、HashMap与ConcurrentHashMap有什么区别?
HashMap是非线程安全的,而ConcurrentHashMap通过减少锁粒度来提高并发性能,检索操作无需锁,从而提供更好的线程安全性和性能。
【Java集合类面试十四】、HashMap是如何解决哈希冲突的?
HashMap解决哈希冲突的方法是通过链表和红黑树:当链表长度超过一定阈值时,转换为红黑树以提高性能;当链表长度缩小到另一个阈值时,再转换回链表。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等