jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比

news/2024/10/30 13:25:07/

一、数据结构差别

  • 1.7:数组+链表

  • 1.8:数组+链表+红黑树

  • 当链表的长度大于8时,数组长度大于64,原来的链表数据结构变为红黑树

二、HashMap中的关键属性和方法区别

方法/变量/类

JDK7

JDK8

备注

DEFAULT_INITIAL_CAPACITY

16

16

默认初始的大小16

MAXIMUM_CAPACITY

2的30

2的30

最大的key的容量

DEFAULT_LOAD_FACTOR

0.75

0.75

默认的负载因子

table

Entry[]

Node<K,V>[]

JDK7:表,根据需要调整大小。长度必须始终是二的幂。

JDK8:该表在首次使用时初始化,并根据需要调整大小。分配时,长度总是二的幂。(我们在某些操作中也允许长度为零,以允许目前不需要的自举机制。)

size

int

int

此映射中包含的键值映射数。

threshold

Int

int

要调整大小的下一个大小值(容量*负载系数)。

loadFactor

float

float

哈希表的加载因子。

modCount

int

int

该HashMap在结构上被修改的次数结构修改是指改变HashMap中映射数量或以其他方式修改其内部结构(例如,rehash)的修改。该字段用于使HashMap的Collection视图上的迭代器快速失败。(请参见ConcurrentModificationException)。

TREEIFY_THRESHOLD

8

为bin使用树而不是列表的bin计数阈值。当向至少有这么多节点的bin添加元素时,bin会转换为树。该值必须大于2,并且应至少为8,将转化成树(链表转成树条件)

UNTREEIFY_THRESHOLD

6

在调整大小操作期间用于取消检测(拆分)桶的长度计数阈值。应小于TREEIFY_THRESHOLD,并且最多为6,以便在移除时进行收缩检测。(树退化成链表的条件)

MIN_TREEIFY_CAPACITY

64

可以将存储箱树化的最小表容量。(否则,如果一个bin中的节点太多,则会调整表的大小。)应至少为4*TREEIFY_THRESHOLD,以避免调整大小阈值和树化阈值之间的冲突。(链表转成树条件或者退化条件)

hash

static int

static final int

Jdk7:将补充散列函数应用于给定的hashCode防御质量较差的散列函数。这是至关重要的

因为HashMap使用两个长度哈希表的幂否则会遇到没有差异的hashCode冲突以较低的比特。注意:空键总是映射到哈希0,因此索引

JDK8:计算key.hashCode()并将哈希的高位扩展(XOR)到低位。因为该表使用两个掩码的幂,所以仅在当前掩码之上以位为单位变化的哈希集总是会发生冲突。(已知的例子包括在小表中保存连续整数的Float键集。)因此,我们应用了一种向下扩展高位影响的变换。比特扩展的速度、效用和质量之间存在折衷。因为许多常见的哈希集已经合理分布(因此不会从扩展中受益),而且因为我们使用树来处理箱中的大型冲突集,所以我们只需以最便宜的方式对一些移位的比特进行异或运算,以减少系统损失,并合并最高比特的影响,否则由于表边界的原因,这些比特将永远不会用于索引计算。

Entry<K,V>

implements Map.Entry<K,V>

Node<K,V>

新增

implements Map.Entry<K,V>

JDK8:基本hash bin节点,用于大多数条目。

entrySet

Set<Map.Entry<K,V>>

保留缓存的entrySet()。请注意,AbstractMap字段用于keySet()和values()。

putIfAbsent

新增

如果传入key对应的value已经存在,就返回存在的value,不进行替换。如果不存在,就添加key和value,返回null

computeIfAbsent

新增

方法计算一个新值,如果该键没有与哈希映射中的任何值相关联,则将其与指定的键相关联。

import java.util.HashMap;

class Main {

  public static void main(String[] args) {

    // 创建 HashMap

    HashMap<String, Integer> digitals= new HashMap<>();

    // 向HashMap插入条目

    prices.put("A", 20);

    prices.put("B", 30);

    prices.put("C", 15);

    System.out.println("HashMap: " + digital);

// 简单用法

int afterChangeDigital = prices.computeIfAbsent("B", key -> 280);

    System.out.println("B的数字: " + afterChangeDigital );

    // 打印更新HashMap

    System.out.println("更新后的 HashMap: " + digitals);

  }

}

UnsafeHolder

新增

支持在反序列化期间重置最终字段

HashIterator

JDK7:private abstract class H HashIterator<E> implements Iterator<E>

HDK8:abstract class HashIterator

TreeNode

新增

树节点

三、JDK1.8版本优点

1.对于1.7来讲,1.8版本的HashMap在数据量大的时候,HashCode相同的大于8,且数组的数量大于64的时候,链表会转化成红黑树,红黑树查询效率更高

2.JDK8版本新特性来讲,具有流及函数计算特点


http://www.ppmy.cn/news/991443.html

相关文章

Git分布式版本控制工具和GitHub(一)--简介

一.Git概述 1.Git简介 【1】什么是Git? Git就是代码版本管理工具。 【2】为什么要使用Git &#xff08;1&#xff09;版本控制 写代码就是不断写BUG的过程&#xff08;当然我们是不会这么说的&#xff09;&#xff0c;很多时候你写了100行代码之后&#xff0c;突然醒悟&…

SpringBoot月度员工绩效考核管理系统【附任务书|ppt|万字文档(LW)和搭建文档】

主要功能 员工登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、绩效指标管理、绩效考核管理 管理员登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、部门管理、岗位管理、员工管理、绩效指标…

Python责任链模式介绍、使用方法

一、Python责任链模式介绍 概念&#xff1a; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将请求从一个对象传递到另一个对象&#xff0c;直到请求被处理为止。在责任链模式中&#xff0c;多个对象组成一个链&am…

Java多线程(二)

目录 一、多进程 二、多线程 三、多线程与多进程的区别与联系 一、多进程 为了实现支持多个任务的系统&#xff0c;这里就设计了进程&#xff0c;用于实现并发编程的效果。由于进程需要频繁的创建和销毁&#xff0c;这里就导致了进程&#xff1a;消耗的资源多、速度慢。开销大主…

Linux近两年高危漏洞修复过程记录

一、背景 2023年8月份&#xff0c;面对即将到来的“大运会”、“亚运会”&#xff0c;今年的例行安全护网阶段也将迎来新的挑战和时刻&#xff0c;为此相关部门发布了国家级实战攻防演练已进入紧急「备战」时刻&#xff01;这里我们主要说一下Linux OS层面的漏洞处理&#xff0…

网络运维基础问题及解答

前言 本篇文章是对于网络运维基础技能的一些常见问题的解答&#xff0c;希望能够为进行期末复习或者对网络运维感兴趣的同学或专业人员提供一定的帮助。 问题及解答 1. 列举 3 种常用字符编码&#xff0c;简述怎样在 str 和 bytes 之间进行编码和解码。 答&#xff1a;常用的…

增量预训练baichuan-13b-chat遇到的那些坑

文章目录 前言资源deepspeed一、训练的坑二、推理的坑三、继续训练的坑总结前言 资源 单机两4090,如图 单卡24G,baichuan-13b-chat单卡推理需要至少26G,因此仅用一张卡,我们是无法加载百川13B的模型,所以,无论是推理还是训练,我们都必须并行! deepspeed 核心思想…

Pytorch个人学习记录总结 09

目录 损失函数与反向传播 L1Loss MSELOSS CrossEntropyLoss 损失函数与反向传播 所需的Loss计算函数都在torch.nn的LossFunctions中&#xff0c;官方网址是&#xff1a;torch.nn — PyTorch 2.0 documentation。举例了L1Loss、MSELoss、CrossEntropyLoss。 在这些Loss函数…