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个 二叉树 -》 转成链表


相关文章
|
25天前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
19 1
|
29天前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
31 1
|
29天前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
|
3月前
|
存储 安全 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)
|
3月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
3月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
4月前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
3月前
|
安全 Java
【Java集合类面试十五】、说一说HashMap和HashTable的区别
HashMap和Hashtable的主要区别在于Hashtable是线程安全的,不允许null键和值,而HashMap是非线程安全的,允许null键和值。
|
3月前
|
安全 Java
【Java集合类面试十六】、HashMap与ConcurrentHashMap有什么区别?
HashMap是非线程安全的,而ConcurrentHashMap通过减少锁粒度来提高并发性能,检索操作无需锁,从而提供更好的线程安全性和性能。
|
3月前
|
Java 编译器 测试技术
Java零基础教学(03):如何正确区别JDK、JRE和JVM??
【8月更文挑战第3天】Java零基础教学篇,手把手实践教学!
58 2