day15_java_基础知识巩固

简介: 自己所掌握的基础知识加以巩固和记录!希望大家点赞收藏并能给予鼓励和支持!有任何建议或者帮助也可以来哦!

Hashmap 的底层原理:

HashMap 在 JDK1.8 之前的实现方式 数组+链表,

但是在 JDK1.8 后对 HashMap 进行了底层优化,改为了由 数组+链表或者数值+红黑树

实现,主要的目的是提高查找效率。

1. Jdk8 数组+链表或者数组+红黑树实现,当链表中的元素超过了 8 个以后, 会

将链表转换为红黑树,当红黑树节点 小于 等于 6 时又会退化为链表。

2. 当 new HashMap():底层没有创建数组,首次调用 put()方法示时,底层创建长度

为 16 的数组,

jdk8 底层的数组是:Node[],而非 Entry[],用数组容量大小乘以加载因子得

到一个值,一旦数组中存储的元素个数超过该值就会调用 rehash 方法将数组容量增加到原

来的两倍,专业术语叫做扩容,在做扩容的时候会生成一个新的数组,原来的所有数据需要

重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.

默认的负载因子大小为 0.75,数组大小为 16。也就是说,默认情况下,那么当 HashMap

中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍。

3. 在我们 Java 中任何对象都有 hashcode,hash 算法就是通过 hashcode 与自己进

行向右位移 16 的异或运算。这样做是为了计算出来的 hash 值足够随机,足够分散,还有

产生的数组下标足够随机,

map.put(k,v)实现原理

(1)首先将 k,v 封装到 Node 对象当中(节点)。

2)先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。

(3)下标位置上如果没有任何元素,就把 Node 添加到这个位置上。如果说下标对应的位

置上有链表。此时,就会拿着 k 和链表上每个节点的 k 进行 equal。如果所有的 equals 方

法返回都是 false,那么这个新的节点将被添加到链表的末尾。如其中有一个 equals 返回了

true,那么这个节点的 value 将会被覆盖。

map.get(k)实现原理

(1)、先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。

(2)、在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返

回 null。如果这个位置上有单向链表,那么它就会拿着参数 K 和单向链表上的每一个节点

的 K 进行 equals,如果所有 equals 方法都返回 false,则 get 方法返回 null。如果其中一

个节点的 K 和参数 K 进行 equals 返回 true,那么此时该节点的 value 就是我们要找的 value

了,get 方法最终返回这个要找的 value。

4. Hash 冲突

不同的对象算出来的数组下标是相同的这样就会产生 hash 冲突,当单线链表达到一定长度

后效率会非常低。

5. 在链表长度大于 8 的时候,将链表就会变成红黑树,提高查询的效率。


相关文章
|
存储 SQL 分布式计算
Zookeeper详解(从安装—入门—使用)
Zookeeper是一个分布式的、开源的应用程序的协调服务,本文将一步步带领大家从安装zookeeper,到入门zookeeper,了解zookeeper的基本知识,Java客户端操作等
2072 1
Zookeeper详解(从安装—入门—使用)
|
人工智能 搜索推荐 算法
AIGC对高等教育的影响
【1月更文挑战第5天】AIGC对高等教育的影响
326 2
AIGC对高等教育的影响
|
传感器 网络协议 物联网
在Linux中搭建Mosquitto MQTT协议消息服务端并结合内网穿透工具实现公网访问
Mosquitto是一个开源的消息代理,它实现了MQTT协议版本3.1和3.1.1。它可以在不同的平台上运行,包括Windows、Linux、macOS等。mosquitto可以用于物联网、传感器、移动应用程序等场景,提供了一种轻量级的、可靠的、基于发布/订阅模式的消息传递机制。
|
5月前
|
SpringCloudAlibaba Java Nacos
尚硅谷SpringCloud教程 笔记
本文介绍了基于Spring Cloud Alibaba构建的cloud-demo工程创建步骤,包括父模块及子模块的配置。父模块采用pom打包方式,定义了Java 8、Spring Boot 2.4.2、Spring Cloud 2020.0.1及Spring Cloud Alibaba 2021.1版本。包含三个主要模块:services(依赖Nacos)、service-order和service-product(均依赖spring-boot-starter-web)。同时提供了discoveryClient的测试代码,展示服务发现功能的实现与验证过程。
347 12
尚硅谷SpringCloud教程 笔记
|
9月前
|
传感器 人工智能 资源调度
智能Agent与灵活调用的背景
本文介绍了智能Agent的基本概念及其灵活调用的实现方式,通过具体代码示例展示了如何设计具备灵活调用能力的智能Agent系统。文章首先阐述了智能Agent的定义、特点及分类,接着详细解释了灵活调用的意义、目标及其实现步骤。最后,探讨了灵活调用在实际应用中的挑战及未来的发展方向。
|
安全 Linux Anolis
centos停止更新?这篇博客教会你CentOS 7转化系统为阿里龙蜥Anolis OS 7
centos停止更新?这篇博客教会你CentOS 7转化系统为阿里龙蜥Anolis OS 7
1104 0
|
存储 PHP 数据安全/隐私保护
spl_object_hash() 函数
spl_object_hash() 函数
|
11月前
|
存储 算法 机器人
Threejs路径规划_基于A*算法案例V2
这篇文章详细介绍了如何在Three.js中使用A*算法进行高效的路径规划,并通过三维物理电路的实例演示了路径计算和优化的过程。
346 0
|
前端开发 JavaScript API
ES6和ES5的区别
ES6和ES5的区别
221 0
|
弹性计算 安全 Java
怎样将Web项目部署到阿里云服务器-5个步骤
怎样将Web项目部署到阿里云服务器-5个步骤
怎样将Web项目部署到阿里云服务器-5个步骤