JAVA基础:HashMap底层数组容量控制,TreeMap底层存取机制,位运算符,原码反码补码

news2024/9/24 22:22:43

List常用实现类

  • List集合常用的实现类有3个 , ArrayList , LinkedList , Vector

ArrayList

  • 类似于我们之前的ArrayBox

  • 底层使用数组存储元素, 插入删除的效率低,检索的效率高

  • 当底层数组存储容量不足时,会进行扩容,每次扩容都是原数组的1.5倍

  • 使用无参构造器创建ArrayList集合时,首先提供的是一个默认0长度的数组(防止内存资源浪费)

    第一次add元素的时候,会创建一个10个长度的数组

Vector

  • 我们在开发中已经不怎么使用了

  • Vector是ArrayList早期版本1.0

  • 起初有自己的一套api方法,后来与ArrayList实现了相同的List接口

  • Vector也是使用数组的结构存储

  • Vector早期版本,线程同步的,安全性高,但效率低。

    ArrayList是非线程同步的,安全性低,但效率高

    (想到StringBuilder和StringBuffer)

  • Vector底层数组容量不足时,会按照原容量的2倍扩容

    ArrayList按照原容量1.5扩容

  • Vector在创建对象时,可以指定扩容增量,每次扩容时会按照指定的增量扩容

    ArrayList只能1.5倍扩容

LinkedList

  • 类似于我们之前封装的LinkedBox

  • 底层使用双向链表存储元素,插入删除效率高,检索效率低

  • LinkedList还提供了一组与头尾元素操作相关的方法。

2 Set常用实现类

  • 常用的实现类有2个 , HashSet , TreeSet

  • 底层用来存储元素的都是对应的Map,相当于只存储了map中的key,而没有value

HashSet

  • 底层使用的是HashMap存储

  • 向set中存储一个元素,就相当于向map中存储了一个key

  • 这个value是什么呢?

    • 是 null 么。 不是 。 底层的map,如果key重复,会返回之前的value。 如果key不重复,返回null

      对于set而言,返回null,说明key不重复,说明保存成功。

      反之说明key重复,保存失败

      如果用null作为value,就无法判断保存是否成功

    • 需要让value值是一个具体的对象。 但每次创建一个新对象,又浪费空间。所以用唯一的对象作为value值

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

 

TreeSet

  • TreeSet底层是通过TreeMap集合存储。

  • 存储的key是自然有序的(有大小顺序)

  • 集合存储的类对象的,这就要求存入TreeSet中的元素(TreeMap中的key),要可以比较大小

    自身比较(Comparable),或提供第三方比较器(Comparator)

  • 使用无参构造器创建TreeSet时,要求存储的元素必须自身可以比较

    要么就使用可以传递第三方比较器的Tree构造方法

public TreeSet(Comparator comparator){}
  • TreeSet在存储第一个元素的时候,也需要保证元素是可以比较大小的。

3 Map常用实现类

  • Map常用的实现类有3个, HashMap ,TreeMap , Hashtable

HashMap

  • 底层使用数组 + 链表结构存储元素。jdk1.8之后,变成了数组 + 链表 or 红黑树 存储元素

  • hash的存储特点是单一元素的 快存 和 快取

  • 每次存储的元素(key),都会通过一个hash算法,计算出该元素在数组中存储的位置

    有可能第1个元素,被计算出存储在5位置。 第2个元素,被计算出存储2位置。使得存储位置是零散的

  • 是根据元素的什么信息进行位置的hash计算

    是根据元素的hashcode值。 每一个元素都会有一个hashcode值,我们通过调用hashcode方法来获得。

    Object中有一个hashcode方法,是一个native修饰的方法,表示该方法是由jvm(c/c++)语言实现的

    是由jvm为对象提供的一个尽可能唯一的数值。可以当成地址使用,不是内存地址

    对象的hashcode不是与生俱来的,当第一次调用hashcode方法时,才会生成hashcode(JOL验证)

    hashcode值的作用,就是为hash存储结构来计算存储位置的。

    hashcode方法可以被重写,重写原则是, equals相等, hashcode也相等。反之无所谓。

  • hash碰撞 ? 两个不同的对象,通过hash计算后,算出了相同的存储位置

    两个对象都需要存储,会在当前位置形成一个链表

扩展:hashmap保存元素时的那些事

  1. 当发生hash碰撞时,会用新节点与当前位置链表中的每一个节点进行比较

    有相等的(hash相等,equals相等。同一个key),key去重,value覆盖

    不相等,就将新元素的节点添加到链表最后

  2. 对于hash碰撞时,当前的hashMap底层,使用的时链表的尾插法

    jdk1.7时,发生hash碰撞,采用的是头插法 (头超法在多线程时会有问题)

  3. jdk1.8之后,HashMap底层使用数组 + 链表 或 红黑树。为什么用到树呢?

    防止链表过长,影响hash效率。当链表长度超过8时,就会尝试转换成红黑树了。

    如果数组长度<64 , 会优先2倍扩容

    如果数组长度>64,就会实现链表到红黑树的转化

HashMap底层数组的长度问题

  • 尽管HashMap提供了有参构造器,可以指定数组的初始容量,但最终都会处理成的2的次幂

  • 也就是说, hashmap底层的数组,无论如何其长度都是2的次幂数

//cap = 10
static final int tableSizeFor(int cap) {
    //n = 9
    //16个0 1000 0000 0000 0000
    int n = cap - 1;
    //n = n | n>>>1 ;
    //n = 28个0 1001 | 28个0 0100
    //n = 28个0 1101
    //1000 0101 0010 1001 | 0100 0010 1001 0100
    //1100 0111 1011 1101
    n |= n >>> 1;
    //1101 | 0011
    //28个0 1111 == 10000=16
    //11111== 100000=32
    //1100 0111 1011 1101 | 0011 0001 1110 1111
    //1111 0111 1111 1111
    n |= n >>> 2;
    // 1111 | 0000
    //1111 0111 1111 1111 | 0000 1111 0111 1111 
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    //x个0, y个1
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

 

hashmap底层有很多的计算都是基于位运算的

  1. 通过hash计算元素的存储位置

    jdk早期版本,通过除法取模计算最终的存储位置 hash=101,length=6 , 101%6=5

  2. 数组扩容

Hashtable

  • Hashtable 与HashMap作用相同,也是hash结构,适合快存, 快取

  • 区别

    1. Hashtable早期版本,线程同步,安全性高,效率低

      HashMap,非线程同步,安全性低,效率高

    2. Hashtable中的key和value不能为null

      HashMap中的key和value可以为null

TreeMap

  • 底层使用的是红黑树存储元素,是BST树的一种特殊形式

  • 我们暂时只需要了解BST

    • 是一个二叉树,一个节点有左右两个子节点,和一个父节点

    • 节点间存储在大小关系,左枝节点 < 父节点 < 右枝节点

  • 存储

    • 第一个节点必然就是最开始的节点,我们称为根节点

    • 第二个数据添加时,会从根节点开始,依次进行大小比较

      • 如果与根节点key相同,说明重复,key取重,value覆盖

      • 如果与根节点key不相同,根据大小,如果小于根节点的key,向左枝找位置,否则反之

      • 接着会与左枝节点比较,相等取重,不等继续比较大小

      • 直到某一个节点的左枝或右枝为null,说明找到了要存放的位置,完成节点链接即可。

  • 遍历

    • 二叉树有3种遍历方式 前序遍历,中序遍历,后序遍历

    • 以父节点为基准

      父 左 右 :前序

      左 父 右 : 中序

      左 右 父 : 后续

BST -> AVL -> 红黑树

4 位运算符

运算符都有哪些呢? 算数运算符 , 赋值运算符,比较运算符,逻辑运算符,条件运算符,位运算符

位运算符的特点:

  • 对二进制进行运算的

  • 按位运算的

  • 位运算符包括

    • &(按位与),|(按位或),^(按位异或),~(按位取反)

    • <<(左移) , >>(无符号右移) , >>>(带符号右移)

 

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

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

相关文章

分区与分桶

分区 分区字段大小写&#xff1a; 在hive中&#xff0c;分区字段名是不区分大小写的&#xff0c;不过字段值是区分大小写的。我们可以来测试一下 导入数据 load data local inpath /home/hivedata/user1.txt into table part4 partition(year2018,month03,DAy21); load data …

Mysql——初识Mysql

目录 数据库基础 创建数据库 服务器&#xff0c;数据库&#xff0c;表关系 数据逻辑存储 MySQL架构 SQL分类 存储引擎 mysql服务端是一个网络服务器&#xff0c;采用的是TCP协议在应用层 &#xff0c;mysql有自己的协议。 数据库基础 mysql不是数据库&#xff0c;是mysql的…

18.1 k8s服务组件之4大黄金指标讲解

本节重点介绍 : 监控4大黄金指标 Latency&#xff1a;延时Utilization&#xff1a;使用率Saturation&#xff1a;饱和度Errors&#xff1a;错误数或错误率 apiserver指标 400、500错误qps访问延迟队列深度 etcd指标kube-scheduler和kube-controller-manager 监控4大黄金指标 …

从手动测试菜鸟,到自动化测试老司机,实现自动化落地

虽然许多伙伴是一个测试老人了&#xff0c;但是基本上所有的测试经验都停留在手工测试方面&#xff0c;对于自动化测试方面的实战经验少之又少。 其实&#xff0c;究其原因&#xff1a;一方面是&#xff0c;自动化方面不求上进&#xff0c;觉得会手工测试就可以了&#xff0c;自…

【计算机基础】用bat命令将Unity导出PC包转成单个exe可执行文件

Unity打包成exe可执行文件 上边连接是很久以前用过的方法&#xff0c;发现操作有些不一样了&#xff0c;并且如果按上述操作比较麻烦&#xff0c;所以写了个bat命令。 图1、导出的pc程序 如图1是导出的pc程序&#xff0c;点击exe文件可运行该程序。 添加pack_project.bat文件 …

基于 SpringBoot 的在线考试系统

专业团队&#xff0c;咨询就送开题报告&#xff0c;欢迎大家私信留言&#xff0c;联系方式在文章底部 摘 要 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化管理。则对…

PX4固定翼控制器详解(五)——L1、NPFG控制器

之前已经讲解了TECS高度与速度控制器&#xff0c;今天是PX4固定翼控制器系列讲解的最后一期&#xff0c;主题是PX4的位置控制器。PX4 1.12及其之前的版本&#xff0c;使用的位置控制器为L1控制器。1.13及其之后的版本&#xff0c;PX4更新了NPFG控制器。NPFG控制器在较强风速下有…

活动目录安全

活动目录安全 1.概述2.常见攻击方式SYSVOL与GPP漏洞MS14-068漏洞Kerberoast攻击内网横移抓取管理员凭证内网钓鱼与欺骗用户密码猜解获取AD数据库文件 3.权限维持手段krbtgt账号与黄金票据服务账号与白银票据利用DSRM账号利用SID History属性利用组策略利用AdminSDHolder利用SSP…

宠物空气净化器去浮毛哪家强?希喂、美的和米家实测分享

要说养宠物后里最让我感到幸福感飙升的家电&#xff0c;必须是宠物空气净化器&#xff0c;没有之一。很多人都喜欢宠物&#xff0c;但应该没有人喜欢清扫&#xff0c;特别是家里宠物多&#xff0c;或者一群宠物在自己家聚在一起之后&#xff0c;要疯狂清除浮毛&#xff0c;真的…

剖解相交链表

相交链表 思路&#xff1a;我们计算A和B链表的长度&#xff0c;求出他们的差值&#xff08;len&#xff09;&#xff0c;让链表长的先多走len步&#xff0c;最后在A,B链表一起向后走&#xff0c;即可相逢于相交节点 实现代码如下&#xff1a; public class Solution {public …

单链表进阶

之前已经介绍过单链表及其一些简单的功能 这次来简单介绍单链表一些的其他接口 1.在指定位置之前插入数据 具体原码&#xff0c;三个参数&#xff0c;phead是链表的指针&#xff0c;pos是节点的地址&#xff0c;x是需要插入的数据。 pos不能为空指针&#xff0c;因为pos为空…

React启动时 Error: error:0308010C:digital envelope routines::unsupported

错误信息&#xff1a; 错误原因&#xff1a;通常与 Node.js 的新版本中 OpenSSL 的默认行为变化有关。从 Node.js 17 开始&#xff0c;OpenSSL 默认启用了 OpenSSL 3.0 的一些新特性&#xff0c;这可能会影响到一些旧的或未更新的库。 解决办法&#xff1a;可以通过设置环境变…

基于STM32设计的室内育苗环境管理系统(物联网)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】ESP8266-WIFI模块【2】MQ135传感器【4】DHT11传感器【5】B1750传感器 …

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要&#xff1a; 近年来&#xff0c;去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能&#xff0c;去噪扩散模…

Flexus X实例全方位指南:智能迁移、跨云搬迁加速与虚机热变配能力的最佳实践

目录 前言 一、云迁移关键挑战 1、企业实例选型关键挑战 2、云算力关键挑战之一 3、云算力关键挑战之二 二、本地IT及其他云搬迁到Flexus X实例上的独有优势 1、Flexus X实例超强性能&#xff0c;遥遥领先同规格友商实例 &#xff08;1&#xff09;底层多重调优&#x…

网络编程——TCP网络通信

通信步骤&#xff1a; 1、连接 2、传输数据 3、关闭连接服务端的创建流程&#xff1a; 1、创建服务端socket对象 socket_family:网络地址类型AF_INET--代表的是ipv4地址类型 socket_type:套接字类型SOCK_STREAM--代表的是tcp套接字SOCK_DGRAM--代表的是udp套接字 2、绑定自己的…

新房安装了约克VRF中央空调真的是明智的选择!

夏天越来越热&#xff0c;新房安装了中央空调真的是太明智了&#xff01;当初装修时&#xff0c;考虑到家里空间大&#xff0c;我就决定装一个中央空调。对比了好多品牌后&#xff0c;朋友推荐了约克VRF中央空调。装好以后&#xff0c;简直惊喜不断&#xff01;      强效除…

基于SpringBoot+Vue+MySQL的美食点餐管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化快速发展的今天&#xff0c;餐饮行业也迎来了转型升级的重要机遇。传统餐饮管理方式面临效率低下、顾客体验不佳等问题。为此&#xff0c;开发一款基于SpringBootVueMySQL架构的美食点餐管理系统显得尤为重要。该系统旨…

【Qualcomm】高通SNPE框架简介、下载与使用

目录 一 高通SNPE框架 1 SNPE简介 2 QNN与SNPE 3 Capabilities 4 工作流程 二 SNPE的安装与使用 1 下载 2 Setup 3 SNPE的使用概述 一 高通SNPE框架 1 SNPE简介 SNPE&#xff08;Snapdragon Neural Processing Engine&#xff09;&#xff0c;是高通公司推出的面向移…

Leetcode尊享面试100题-252.会议室

给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 示例 1&#xff1a; 输入&#xff1a;intervals [[0,30],[5,10],[15,20]] 输出&#xff…