HashMap在JDK7.0及之前和JDK8.0及之后区别

简介: 前言我们在学习集合的时候,出去list就是map集合使用比较多,今天主要说一下常用的HashMap底层的进化

HashMap在JDK7.0及之前和JDK8.0及之后区别


前言

我们在学习集合的时候,出去list就是map集合使用比较多,今天主要说一下常用的HashMap底层的进化


干货

jdk7.0之前 数组 + 链表 阈值:30

jdk8.0开始 数组 + 链表 + 二叉树 阈值:30

HashMap底层在1.8之前是基于数组和链表组成 形成一个哈希表


首先数组的优点:

查找元素效率高 由于数组这个数据结构的特点

他们是等大连续 所以当我们想要查找某个元素的时候

只要计算偏移量给可以 时间复杂度是O(n)


链表的优点:

链表的数据结构导致他们在添加 删除元素的时候效率高

他们通过保存地址指向形成一个链表结构彼此相连接

当我们想要往链表里面添加或者删除一个元素的时候

只需要修改地址指向就可以 时间复杂度是O(n)

当我们想要往HashSet/HashMap集合里面添加元素的时候

元素被装进那个小组 我们是需要根据hahCode()算出

哈希码值 然后根据哈希码值%分组组数看余数

通过余数判断应该去哪一个小组[查找进入的小组]

所以哈希表的表头应该用数组存储这个余数 方便查找

但是进入该小组之后 如果发现这个小组里面有元素需要

在详细作比较 如果比较完之后 发现该小组里面的元素

没有和新来的元素一样 那么新来元素需要插入进去

既然组内经常涉及到插入删除元素 那么应该考虑用链表结构


所以在8.0之前 先根据哈希码值计算去到哪个小组

表头用数组装 好查找

查找应该去到某个小组之后 开始往该小组里面插入、删除元素

所以组内又是拿着链表装 好添加、删除

但是在8.0及之后 考虑到可能算法不好 导致一个组内里面的元素

过多 那么再往某个小组里面添加元素的时候 比较的次数

变多 所以在8.0开始 所有个很大的进步 就是引入二叉树机制

当组内元素个数>8个 由链表转成二叉树

这样又能分散点元素 在添加、删除元素的时候就不需要和

组内所有的元素都作比较 只需要和部分元素作比较

当组内元素个数<6个 二叉树 -》 转成链表


相关文章
|
安全
HashTable与HashMap的区别
(1)HashTable的每个方法都用synchronized修饰,因此是线程安全的,但同时读写效率很低 (2)HashTable的Key不允许为null (3)HashTable只对key进行一次hash,HashMap进行了两次Hash (4)HashTable底层使用的数组加链表HashTable与HashMap的区别
339 2
|
存储 算法 Java
JvM JDK JRE 三者区别与联系详解
本文深入解析了Java编程中的三个核心概念:JVM(Java虚拟机)、JDK(Java开发工具包)和JRE(Java运行环境)。JVM是执行Java字节码的虚拟计算机,实现“一次编译,到处运行”;JDK包含JRE及开发工具,用于编写和调试Java程序;JRE负责运行已编译的Java程序。文章详细阐述了它们的功能、组成及应用场景,并通过实例说明其在实际开发中的作用,帮助开发者理解三者联系与区别,提升开发效率与问题解决能力。适合Java初学者及进阶开发者学习参考。
1750 3
|
Java Spring
JDK动态代理和CGLIB动态代理的区别
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: ● JDK动态代理只提供接口的代理,不支持类的代理Proxy.newProxyInstance(类加载器, 代理对象实现的所有接口, 代理执行器) ● CGLIB是通过继承的方式做的动态代理 , 如果某个类被标记为final,那么它是无法使用 CGLIB做动态代理的。Enhancer.create(父类的字节码对象, 代理执行器)
|
存储 安全 Java
如何优雅地回答HashSet与HashMap的区别?看这里!
哈喽,大家好!我是小米,29岁程序员。本文聚焦Java开发中经典的面试题——HashSet和HashMap的区别。HashSet基于HashMap实现,存储唯一值;HashMap存储键值对。两者在数据结构、使用场景、操作方法等方面有显著差异。HashSet无序且依赖元素的hashCode和equals方法保证唯一性,而HashMap需注意线程安全问题。掌握这些知识点,助你轻松应对面试。更多技术干货,欢迎关注我的微信公众号“软件求生”。
801 4
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
503 1
|
小程序 Java 程序员
JDK 和 JRE 有什么区别
JDK(Java Development Kit)是Java开发工具包,包含编译器、调试器等开发工具,用于开发Java程序。JRE(Java Runtime Environment)是Java运行环境,包含Java虚拟机和类库,用于运行Java程序。简言之,JDK用于编写Java程序,JRE用于运行这些程序。
763 2
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
426 1
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
329 1
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
749 0
剖析Tomcat线程池与JDK线程池的区别和联系!