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


相关文章
|
22天前
|
安全
HashTable与HashMap的区别
(1)HashTable的每个方法都用synchronized修饰,因此是线程安全的,但同时读写效率很低 (2)HashTable的Key不允许为null (3)HashTable只对key进行一次hash,HashMap进行了两次Hash (4)HashTable底层使用的数组加链表HashTable与HashMap的区别
23 2
|
15天前
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
22 1
|
24天前
|
小程序 Java 程序员
JDK 和 JRE 有什么区别
JDK(Java Development Kit)是Java开发工具包,包含编译器、调试器等开发工具,用于开发Java程序。JRE(Java Runtime Environment)是Java运行环境,包含Java虚拟机和类库,用于运行Java程序。简言之,JDK用于编写Java程序,JRE用于运行这些程序。
39 1
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
32 1
|
2月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
41 1
|
2月前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
133 0
剖析Tomcat线程池与JDK线程池的区别和联系!
|
4月前
|
存储 安全 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)
|
4月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
4月前
|
存储 Java
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
JDK7中的HashMap使用数组加链表解决冲突,而JDK8增加了红黑树结构以优化链表过长时的性能,提高查找效率。
|
4月前
|
安全 Java
【Java集合类面试十五】、说一说HashMap和HashTable的区别
HashMap和Hashtable的主要区别在于Hashtable是线程安全的,不允许null键和值,而HashMap是非线程安全的,允许null键和值。