HashMap数据结构剖析(JDK8红黑树)拓展到Integer自动拆装箱及缓存

用友Java岗笔试复盘:高频考点与避坑指南 Java技术栈的掌握程度,往往直接决定企业级开发岗位的笔试表现。从Java基础语法、集合框架到并发编程,这些核心概念不仅是日常开发的地基,也是面试笔试中反复考察的重点。理解HashMap的底层原理、JVM内存模型与垃圾回收机制,掌握synchronized与volatile的线程安全语义,熟悉Spring IOC与AOP的运作逻辑,再到MySQL索引与事务隔离级别的实际应用,每一层知识都需要从原理到工程实践融会贯通。对于准备用友这类企业服务厂商Java岗位的求职者而言,笔试题目通常围绕这些技术点展开,并结合 阅读详情

近期在研究HaspMap的数据结构,随后将一系列遇到的问题如下等都整理出来如下::

  • 对象在HashMap中存储的数组索引index如何计算?
  • hashcode与hash值的区别?
  • HashMap的数组长度为什么一定是2^n?
  • 红黑树与AVL树的优劣对比?
  • 利用hashcode判断对象相等与用equals(),“==”的区别及联系
  • Integer的自动拆装箱以及缓存

首先要知道HashMap最早的数据结构的存储由数组+链表的方式存储。从JDK8开始变化为数组+链表+红黑树的存储方式,当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。
在这里插入图片描述

这里先讲解HashMap如何计算出对象hashcode并将其放到指定数组索引的。

  • 1、HashMap先利用key的hashcode()计算出hashcode(是一个int类型)
  • 2、利用hashcode与 hashcode的无符号右移16位 做异或运算 得到hash值
static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    //关于无符号右移 >>> 以及下面的 &运算 记忆生疏了的 可以参考本人关于位运算的博客:
    https://blog.csdn.net/cpppp66/article/details/115795107
  • 3、利用hash值与length-1做 &运算求出存储时的对应数组索引index。 length是数组长度(有时也被称为桶bucket的数量)。

随之就引申出来,为什么求index用的是 &运算 而不是 求模 mod运算呢?

因为以往的Hash散列表为保证对象都能散列分布在数组上,往往hash值的计算利用的是取模运算。然而由于计算机计算原理,&运算速度是大于 mod运算的。但需要注意的是!

a mod b = a & (b-1) 成立的条件是b=2^n !

由此便规定了,HashMap的数组长度一定是2^n
!
这应该可以解答上面关于为什么HashMap的数组长度一定是2^n 的问题了。

而在Java中,HashMap的构造是有参数InitialCapacity的,默认是16。在《阿里巴巴Java开发手册》中有提到:

【推荐】HashMap(int initialCapacity) 初始化时设置
initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loader factor)默认为 0.75,
若未初始值initialCapacity大小,则默认为16。
原因是若没有设置容量初始大小,随着元素不断增加,容量被迫扩大,resize 需要重建 hash 表,严重影响性能。

这里resize的时候,就是数组长度*2,然后重新计算每个对象的index,极其影响性能。

红黑树的介绍以及与AVL树的区别

关于红黑树RB Tree:
红黑树是一种含有红黑结点的二叉平衡查找树。它必须满足下面性质:

  • 性质1:每个节点要么是黑色,要么是红色。
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色(在Java中,叶子结点是为null的结点)。
  • 性质4:每个红色结点的两个子结点一定都是黑色。
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

关于平衡二叉树:其又被称之为AVL树,是一种每个结点的左右子树高度差都不超过1的二叉排序树。在插入新结点或删除结点后,若树不平衡则会进行旋转重新变成平衡。红黑树在此基础发展。

二叉排序树:又称之为Binary Search Tree二叉搜索树。其性质是任何一个结点的左子树结点值都小于其右子树的结点值(若子树不空)。且不允许有相等值的结点出现。

红黑树与AVL树的区别:
红黑树不追求"完全平衡",只追求大致平衡,牺牲了高度平衡换取插入和删除结点的易维护性:任何不平衡都会在三次旋转之内解决。 由于AVL是严格平衡树,不同情况下删除和增加结点时旋转次数会多于红黑树。

红黑树的查询性能略微逊色于AVL树(但都是Olog(n)),因为其比AVL树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的AVL树最多多一次比较。然而维护强于AVL,能更快恢复平衡。

利用hashcode判断对象相等与用equals(),“==”的区别及联系:

1、hashcode与equals间的关系:

hashcode()在Object类里是public int native方法,但返回的hashcode不是Object对象的内存地址(是由地址变换的)!

hashcode()在不同类中,重写后生成hashcode的规则会不同。

但一般具有以下原则:
1.若两个对象equals返回true,则hashCode有必要也返回相同的int数。
2.若两个对象equals返回false,但hashCode有小概率可能会相同,然而自己设计时建议为不相等的对象生成不同hashCode值这样可以提高哈希表的性能。
3.若两个对象hashCode返回相同int数,则equals不一定返回true。
4.若两个对象hashCode返回不同int数,则equals一定返回false。

所以当需要对比对象的时候;

  • 首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了)
  • 如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了。

【强制】1、对于集合的处理:只要重写 equals(),就必须重写 hashCode()。
2、因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。 ----《阿里巴巴Java开发手册》

equals()与 == 的区别

“==” 判断的是内存地址空间是否相同,仅适用于8大基本数据类型与本类型作比较。
尽管这8大基本类型的不同名变量的值相同,引用的却是常量池中同一值的地址。
所以可以用 “==” 来判断是否相等。

equals()判断的是封装类变量内值是否相等。
不同的封装类变量即使值相等,在堆中的内存地址也不同,所以不可以用 == 来判断。

这里再拓展一点为什么Interger与int做“==”比较可以返回true。

这里要首先知道Integer是int的包装类,是个引用类型并且类里面有很多方法可以使用。

但是当Integer与int做“==”比较的时候,其实是Integer自动拆箱(unboxing)变成了int,然后再去做比较。两个相同值的int做“==”比较当然结果是true囖。

而关于自动装箱:

Integer i=6; 

//实际执行的是 Integer i=Integer.valueOf(6);

给i传的是个int值,却变成了Integer对象,这就称之为自动装箱boxing

还要拓展关于Interger缓存的小点:

		Integer a = 127;
		Integer b = 127;
		System.out.println(a == b);//true
		
		Integer c = 128;
		Integer d = 128;
		System.out.println(c == d);//false

[-128,127]是Integer的缓存范围。当实例化了一值处于缓存范围内的对象时,会在栈内存常量池中创建这一值,当再次有Integer使用常量池中具有的值来实例化对象时,会直接指向此常量地址空间。所以出现了"=="判断为true的情况

京东Android校招笔试真题解析:考点拆解与备考攻略 Android开发岗校招笔试往往涵盖Java基础、组件机制与数据结构算法,是检验候选人计算机功底和编码能力的关键环节。理解HashMap底层扩容与并发问题、Handler消息循环原理、Activity启动模式等核心知识,有助于构建完整的Android技术体系。这些原理不仅用于解题,更直接支撑日常开发中的性能优化、异步任务处理和架构设计。针对京东等大厂真题进行考点拆解与刷题路径规划,能帮助应届生系统备战校招,快速掌握高频考点、编程题解法与时间管理技巧,实现从基础理论到工程实践的有效转化。 阅读详情

相关推荐

JVM面试题截图及个人补充

jvm面试题

の博客 234

java_进阶:Map、自动装箱拆箱

Map 将键映射到值的对象。Map不能包含重复的键; 每个键可以映射到最多一个值,一个值可以被多个键所映射 public interface Map<K,V> 1、Map 接口的常用方法 Object put(Object key,Object value)将指定键值对(key 和 value)添加到 Map 集合中,如果此 Map 集合以前包含一个该键 key 的键值对,则用参数 key 和 value 替换旧值。 Object get(Object key)返回指定键 key 所对应的值,

wbgd_19751979的博客 774

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1905

Java学习——HashMap

HashMap 双列集合,包含两个值,值与键,键唯一,允许null的值和null键。 不保证集合元素的顺序。 构造方法 HashMap() 构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。 HashMap(int initialCapacity) 构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。 HashMap(int initialCapacity, float loadFactor) 构造一个空的 HashMap具有指定的初始容量和负载因子。 H

971

BEVFormer vs BEVFusion:5个关键差异点帮你选对环视感知方案

本文深入对比了自动驾驶领域两大主流环视感知方案BEVFormer与BEVFusion。BEVFormer作为纯视觉BEV感知的标杆,通过注意力机制隐式学习深度,成本较低;而BEVFusion作为多模态融合典范,融合激光雷达与摄像头数据,在性能、小目标检测及极端环境鲁棒性上优势显著。文章从计算效率、部署成本、数据依赖性等五个核心维度提供选型指南,帮助技术决策者根据自身算力预算与传感器配置做出明智选择。

weixin_29306011的博客 123

MoveIt2 Servo实战:解锁UR机械臂在ROS2中的实时遥操作与动态响应

本文深入探讨了MoveIt2 Servo在UR机械臂实时遥操作中的应用,展示了如何通过ROS2实现毫秒级动态响应。文章详细解析了Servo的核心价值、环境配置、控制器适配及高级调优技巧,特别适用于需要高精度控制的工业场景,如VR手术训练和汽车装配线。

weixin_29044157的博客 247

java hashmapinteger,在Java中将Integer用作HashMap的键

Recently I was looking for good implementation of hashCode() method in Java API and looked through Integer source code. Didn't expect that, but the hashCode() just returns the backed int value.public ...

weixin_35715118的博客 937

RAG优化知识库检索(4):混合检索技术

混合检索技术在RAG(检索增强生成)系统中的应用显著提升了检索效果。本文探讨了语义检索与关键词检索的优缺点,指出两者在语义理解和精确匹配方面的互补性。通过结合BM25与向量检索,混合检索系统能够更全面地捕捉文档的相关性。文章详细介绍了并行检索、级联检索、稀疏-密集混合表示等多种结合方式,并探讨了权重调整策略,如线性组合、动态权重调整和排序融合算法。此外,稀疏-密集混合检索架构的设计和实现方案也被深入分析,展示了如何通过结合不同检索方法的优势,提升RAG系统的检索质量和效率。

分享一些感兴趣的技术方面 2072

HashMap:常见用法总结

HashMap:常见用法总结前言一、常规用法总结1.增加元素:put()2.删除元素:remove()3.获取Key对应Value:get()、getOrDefault()4.遍历Map:entrySet ,keySet,Iterator5.清空Map:clear6.查看Map长度:size总结

qq_46119575的博客 3011

金蝶云星空核心数据表解析与高效关联查询指南

本文深入解析金蝶云星空核心数据表结构,提供高效关联查询的实战指南。文章详细介绍了基础资料、业务单据和财务模块的关键表及其关联逻辑,重点阐述了如何利用关联表(_LK表)进行跨单据溯源,并分享了编写高性能SQL的实用技巧与避坑建议,帮助开发者、实施顾问和数据分析师快速掌握数据查询方法,提升工作效率。

weixin_29254673的博客 524

TTL转RS422(B)工业级转换模块设计:从原理到实战部署

在工业自动化与嵌入式系统中,串行通信是实现设备间数据交换的基础。其核心原理在于通过特定的电气标准与协议,将数据位序列化后进行传输。RS422作为一种差分平衡传输协议,相比常见的TTL电平,在抗共模干扰与远距离传输能力上具有显著的技术优势,这使其成为工业现场总线、楼宇自动化等对可靠性要求严苛场景的优选方案。要实现TTL设备与RS422网络的稳定互联,关键在于设计一个能够完成单端信号到差分信号高质量转换的硬件模块。这涉及到差分总线收发器芯片的选型、包含终端电阻与TVS二极管的保护电路设计,以及遵循差分走线规则的

weixin_29195615的博客 341

JAVA知识体系

put时会有hash碰撞,两个线程的key hash值一样,线程AB都判断那个位置为空,1.7头插可能会死循环,数据丢失。1.8尾插数据也被覆盖导致丢失。

qq_34150524的博客 741

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9429

面试-java基础(3)

反射机制以及动态代理的理解 反射机制是java语言的一项基础能力,赋予程序运行是自省的能力,可以直接操作类或者对象,获取类定义或者直接执行相应的方法。 动态代理是一种方便运行是动态构建代理、动态处理代理方法的机制,常见的动态代理 jdk自带的动态代理、cglib、javaassist int和integer区别,integer缓存范围 int是java中的原始数据类型,Integer是int对...

chenlin597898889的博客 211

SAP_SD模块-销售批次策略应用记录

SAP_SD模块-销售批次策略完整案例

风沙的博客 2610

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java基础语法实战指南:从核心概念到高频坑点解析

编程语言的基础语法是构建软件的逻辑基石,它定义了数据表示、流程控制和代码组织的核心规则。理解变量、数据类型、运算符和控制结构等基础概念,是掌握任何编程范式的第一步。这些语法元素共同构成了程序的执行逻辑和内存模型,其重要性在于确保代码的健壮性、可读性和可维护性。在实际的工程开发中,无论是构建微服务架构还是实现高并发业务,扎实的语法基础都是高效排查问题、进行性能优化的前提。本文聚焦于Java语言,深入探讨了面向对象编程、集合框架、异常处理等核心语法机制,并针对自动拆装箱、字符串拼接等高频实战场景中的典型问题,如

weixin_33858485的博客 315

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java学习笔记:从环境配置到核心原理的实战心法

Java作为一门面向对象的编程语言,其核心在于通过虚拟机(JVM)实现跨平台运行。理解JDK、JRE与JVM的关系是掌握Java生态的基础,这直接关系到环境配置、程序编译与执行的原理。扎实的Java基础不仅能提升代码质量,更是应对复杂业务场景和性能优化的关键。在实际开发中,集合框架(如HashMap的底层实现)和内存管理(如避免OutOfMemoryError)是高频出现的核心议题。本文基于一份详实的Java学习笔记,系统梳理了从环境搭建、语法核心到集合、异常等进阶内容的实战路径与避坑指南,旨在帮助开发者构

weixin_34025151的博客 429

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

2024秋招贝壳找房Java笔试高频考点与实战复盘

在Java工程师的求职过程中,笔试是检验技术功底与工程思维的第一道关卡。无论是集合框架中的HashMap底层原理,还是并发编程下的线程安全机制,亦或是JVM内存管理与类加载过程,这些核心知识点都是大厂笔试的高频命题方向。理解其设计思想与技术价值,能帮助开发者在海量数据存储、高并发访问、分布式中间件等真实业务场景中做出合理的技术选型与优化。从基础语法到框架原理,从算法编程到线上问题排查,系统化掌握Java技术体系并灵活运用于工程实践,是提升竞争力的关键。本文以2024届秋招贝壳找房Java工程师第一批笔试为样

weixin_34242819的博客 350

万字JavaSE知识图谱:从核心原理到实战避坑的系统性梳理

JavaSE作为Java语言的标准版,是构建所有Java应用的基石,其核心在于提供一套完整的编程模型和丰富的API库。理解其底层原理,如JVM内存模型、面向对象思想、集合框架的数据结构与算法,是编写高效、健壮代码的关键。这些技术价值体现在提升代码质量、保障系统性能与并发安全上,广泛应用于企业级后端开发、大数据处理和Android应用等领域。本文基于【知识图谱】的系统化梳理方法,结合【集合框架】等高频核心模块的深度解析,旨在帮助开发者构建清晰、稳固的JavaSE知识体系,有效应对技术面试与复杂业务场景。

weixin_30268921的博客 321

Java基础(笔记)

根据链接 Java 工程师成神之路!的目录复习Java基础,并记录下一些笔记供以后翻阅。 Part1 Java值传递 无论是值传递还是引用传递,其实都是一种求值策略(Evaluation strategy)。在求值策略中,还有一种叫做按共享传递(call by sharing)。其实Java中的参数传递严格意义上说应该是按共享传递。Java值传递 ...

qq_24292077的博客 374

Java高频面试题解析:核心考点与实战技巧

Java作为主流编程语言,其核心机制如JVM内存模型、多线程同步等原理是开发者必须掌握的基础。从自动装箱拆箱的性能影响,到HashMap扩容因子的数学依据,这些底层实现直接影响系统性能。在分布式系统和高并发场景下,合理运用锁升级机制、GC调优等技术能显著提升吞吐量。本文基于300+面试案例,重点解析数据类型、集合框架等高频考点中的典型陷阱,例如包装类NPE问题、ConcurrentModificationException触发条件等,帮助开发者避开80%的常见失误。

weixin_30915951的博客 401

用友秋招Java笔试复盘:从集合框架到JVM并发,这些考点别踩坑

Java程序员求职,笔试往往是第一道硬门槛,比面试更考验基础功底与实战细节。从环境变量配置到javamemory不足的排查,从HashMap底层原理到JVM内存区域,从volatile语义到Spring事务边界,这些技术点既是日常开发的高频场景,也是企业笔试中的经典考点。用友这类To B企业尤其看重候选人对基础概念的深度理解,笔试题目常将多个知识点融合变形,考察你是否真正读懂源码与原理。本文以一场真实秋招笔试为样本,逐题复盘用友Java岗的题型分布、时间策略和易错陷阱,并给出针对性的备考建议,帮助正在准备J

weixin_34082695的博客 454

Java 常用特性整理(测开)

整理了 Java 测试开发日常高频用到的核心知识点,覆盖基础语法、面向对象、集合框架、异常处理、IO、多线程、泛型、反射、Lambda/Stream 等章节。

m0_37606579的博客 424

携程春招技术岗笔试全解析:算法考点与避坑指南

在互联网大厂求职中,笔试是技术人才筛选的重要关卡,其考察范围往往涵盖算法与数据结构、计算机网络、操作系统、数据库等核心基础。动态规划作为解决区间覆盖类问题的经典方法,常被包装成酒店预订、订单调度等业务场景,理解状态转移与边界处理是关键。同时,HTTP协议状态码、B+树索引、进程调度等基础知识的高频出现,要求考生具备扎实的功底。从通用技术概念出发,掌握经典算法模型与系统底层原理,不仅能应对各类在线评测,也能为实际工程中的性能优化与异常排查打下基础。本文以携程春招技术通用岗笔试为例,梳理题型结构、编程题拆解与多

weixin_34056162的博客 313

Java面试题

1Java基础 1.1什么是Java虚拟机 Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 1.2JDK 和 JRE 有什么区别?

兴浩的博客 1856

HashMap的key为Integer时为什么有序

首先我们知道,HashMap遍历的顺序和插入的顺序是不一样的,而LinkedHashMap遍历的顺序和插入的顺序是一致的。看代码很明显,使用LInkedHashMap遍历是有序的,而使用HashMap是无序的。但是另外一种情况,当key为Integer时,就不一样了。当key为Integer传入HashMap时,它的遍历结果仍然是有序的。

qq_40703471的博客 1798
上一篇: 关于位运算以及原码反码补码
下一篇: KMP算法:字符串匹配
老邓CODING
博客等级 码龄8年 9粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值