HashMap 学习笔记

1.HashMap 的类继承关系

在这里插入图片描述

图示即为 Map 相关类的继承关系。源码中的类签名如下:

public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {......
}

2.HashMap 的底层存储结构

HashMap 的底层存储结构是 Node 类, 实现了 Map 中的 Entry。即 HashMap 底层是由 Node 数组实现存储的。

3.JDK 1.8 中 HashMap 中重要的几个知识点

3.1 数组容量始终为 2 的 N 次幂

HashMap 的数组容量始终为 2 的 N 次幂。原因是当数组容量为 2 的 N 次幂时, hash() 方法计算出来的 hash 值直接与(数组容量 - 1) 进行 & (位与)运算就可以得到元素在数组中的下标。

3.2 链表与红黑树的相互转化条件

  • 链表转红黑树: 链表长度大于等于 8, 且数组的长度大于64。注意, 链表长度大于等于 8 一个条件并不会把链表转化为红黑树, 只有两个条件都满足才会触发链表转红黑树的操作, 否则会触发一次 resize()
  • 红黑树转链表: 红黑树的节点小于等于 6 时。

4.HashMap 在 JDK 1.7 中的死锁问题

HashMapJDK 1.7 版本中, 在并发写入的情况下可能会出现死锁的问题。这主要是因为链表的插入方式采用的是头插法

5.JDK 1.8 进行的优化

  • 数组+链表改成了数组+链表or红黑树
  • 链表的插入方式从头插法变成了尾插法
  • 扩容与插入顺序的变化: JDK 1.7 中, 先判断是否需要扩容再插入, JDK 1.8 中, 先插入再判断是否需要扩容
  • 扩容时重新定位元素位置的方法不同
    - JDK 1.7 中, 需要调用 hashcode 方法来重新定位在新数组的位置
    - JDK 1.8 中, 直接使用了 JDK 1.7 中的规律, 即扩容后新数组中的位置 = 原位置or原位置+旧容量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中清空表和截断表的区别(新手入门)

清空表和截断表 清空表&#xff1a;delete from users&#xff1b; 清空表只是清空表中的逻辑数据&#xff0c;但是物理数据不清除&#xff0c;如主键值、索引等不被清除&#xff0c;还是原来的值。 截断表&#xff1a;truncate table users&#xff1b; 截断表可以用于删除…

终止线程的方法

如何终止一个正在运行的线程&#xff1f; 设置状态位来终止一个正在运行的线程。可以自己实现, 也可以使用 interrupt 方法来设置这个状态位, 然后在代码中判断 isInterrupted 的返回结果来执行退出执行的逻辑。 了解 Thread 类中的 stop、interrupt 方法吗?为什么不用 stop…

十大经典排序算法动画与解析(配代码完全版)

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常见的内部排序算法有&…

服务启动不了,显示 config 异常的问题排查

文章目录问题详情排查过程1.1 查看配置文件是否可以正常加载1.2 进入 config 服务正在运行的容器, 查看文件是否存在1.3 查看容器运行日志:最后发现是配置文件中多了一个 TAB 符,唉,说多了都是泪!问题详情 出现异常报错: Could not locate PropertySource and the fail fast p…

java使用Socket类接收和发送数据

java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分&#xff0c;而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上&#xff0c;并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用&a…

Docker Swarm compose 文件 depends_on 属性

Swarm 部署时候如果需要管理应用之间的启动先后顺序,则可以使用 services.depends_on 属性进行指定,例如 services:eureka-service:......depends_on:- config-service......

Java 单例模式:懒加载(延迟加载)和即时加载

Java 单例模式&#xff1a;懒加载&#xff08;延迟加载&#xff09;和即时加载 引言 在开发中&#xff0c;如果某个实例的创建需要消耗很多系统资源&#xff0c;那么我们通常会使用惰性加载机制&#xff08;或懒加载、延时加载&#xff09;&#xff0c;也就是说只有当使用到这…

递推算法之滚动数组思维方式

概述 在算法的最终结果只用到本层与上一层的结果时&#xff0c; 可以使用滚动数组思想。 简单的理解就是每次都使用固定的几个存储空间达到压缩节省存储空间的作用&#xff0c; 主要用在递推算法中。示例1&#xff1a; 爬楼梯问题 假设你正在爬楼梯。需要 n 阶你才能到达楼顶…

Java创建并执行线程的四种方法

Java创建并执行线程的四种方法 java里面创建线程有四种方式&#xff1a; 无返回&#xff1a; 实现Runnable接口&#xff0c;重写run();继承Thread类&#xff0c;重写run(); 有返回&#xff1a;实现Callable接口&#xff0c;重写call(),利用FutureTask包装Callable&#xff0c…

idea中svn的更新、检出、提交操作

一、首先集成svn到idea 点击号连接svn仓库地址 等待代码下载完毕后就可以对代码进行update,commit操作了 更新操作方法一:项目上右键 方法二:点击快捷图标 方法三: 代码提交 方法一 方法二: 方法三: 会跳出窗口: 然后点击Commit 如果检测代码有错误会询问你是否要处理,一般确定…

判断链表是否相交并找出交点

问题概述 单链表定义如下&#xff1a; public class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;}}编写程序&#xff0c; 找出两个链表的交点。 如图所示&#xff0c;链表 A 和链表 B 在节点 8 处相交。 算法思路 首先确定一个事情&#xff1a; …

socket和http区别有哪些

socket和http区别有哪些 1、socket连接就是所谓的长连接&#xff0c;理论上客户端和服务器端一旦建立起连接将不会主动断掉&#xff1b; 2、http连接就是所谓的短连接&#xff0c;即客户端向服务器端发送一次请求&#xff0c;服务器端响应后连接即会断掉。 socket和http区别&…

Spring Bean 的生命周期

概述 Spring 启动&#xff0c;扫描指定的包路径&#xff0c;查找需要被 Spring 管理的 bean构造 BeanDefinition 对象实例化 bean&#xff0c;如果有多个构造方法&#xff0c;则需要推断构造方法&#xff0c;确定好构造方法后&#xff0c;进行实例化得到一个对象进行 bean 的属…

兄弟3150cdn更换硒鼓_耗材知多点:一体式硒鼓及分离式硒鼓

相信第一次接触硒鼓的小伙伴们&#xff0c;会比较诧异为什么有些硒鼓可以直接装机使用&#xff0c;而有些硒鼓&#xff0c;却需要两个部件组合起来或分别装机才能正常使用。今天就带大家来了解一下什么是一体式硒鼓&#xff0c;什么又是分离式硒鼓。①一体式硒鼓&#xff1a;以…

Java IO流之PrintStream分析

简介 PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是: 与其他流不同的是,Prin…

bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评

《复仇者联盟4&#xff1a;终局之战》已经上映快三个星期了&#xff0c;全球票房破24亿美元&#xff0c;国内票房破40亿人民币。虽然现在热度逐渐下降&#xff0c;但是我们还是恬不知耻地来蹭一蹭热度。上映伊始《复联4》的豆瓣评分曾破了9分。后来持续走低&#xff0c;现在《复…

RabbitMQ 基本概念与高级特性

文章目录1. 什么是消息队列1.1 消息队列概述1.2 使用消息队列的优势1.3 使用消息队列的劣势1.4 常见的消息队列产品对比2. RabbitMQ 基本概念2.1 RabbitMQ 概述2.2 RabbitMQ 的概念模型2.2.1 Message2.2.2 Publisher2.2.3 Exchange2.2.4 Binding2.2.5 Queue2.2.6 Connection2.2…

HTTP 和 SOCKET 的区别

HTTP 和 SOCKET 的区别 要弄明白 http 和 socket 首先要熟悉网络七层&#xff1a;物 数 网 传 会 表 应&#xff0c;如图1 如图1 HTTP 协议:超文本传输协议&#xff0c;对应于应用层&#xff0c;用于如何封装数据. TCP/UDP 协议:传输控制协议&#xff0c;对应于传输层&…

java 8进制串转中文_为什么不能用中文进行编程?而英文就可以

前些天大雄无意间听见几个线下班小伙伴说真的是无(te)意(di)的“我要补英文”“对&#xff0c;英文真的很重要”“如果编码用中文就好了”...听见这大雄就不淡定了中文代码小伙伴确定能够搞懂&#xff1f;&#xff1f;首先我们大概的看一下中文编码&#xff1a;你以为会写中文写…

Java 父子类方法调用顺序

概述 在 Java 的多态中&#xff0c;有个结论可以直接引用: 对象类型看左边静态方法和成员变量看左边成员方法&#xff0c;编译看左边&#xff0c;运行看右边&#xff08;子类可能重写&#xff09;如果有多个匹配的方法可以调用&#xff0c;优先调用参数最匹配的一个 调用顺序…