java集合(二)--set收尾+HashMap

文章目录

  • 1.linkedhashset的介绍
  • 2.linkedhashset源码分析
  • 3.Map的基本介绍
    • 31.基本属性
    • 3.2map里面的集合以及内部数据类型
  • 4.Map接口的常见方法
  • 5.map里面的遍历的方法
    • 5.1根据key直接遍历
    • 5.2直接拿到这个value值
    • 5.3使用这个entry遍历
  • 6.hashmap扩容转化红黑树的模拟
  • 7.hashtable底层介绍
  • 8.properties介绍
  • 9.集合的选型规则

1.linkedhashset的介绍

下面的这个就是我们的linkedhashset的结构示意图,和我们之前介绍的这个hashset相比之下,这个linkedhashset的区别就是我们的这个linkedhashset是一个双向链表的结构;

下面的这个我们是首先插入了一个AA这个内容,然后是插入这个456,接着插入456这个时候可能计算这个hash值之后这个就无法继续插入了,因为这个已经存在了,我们创建一个新的对象,然后添加这个123,hsp这个字符串,在这个过程中,我们每一次添加一个元素,这个元素就会和上一个加入的数据构成双向的链表;

因此这个

插入和打印输出的顺序问题:我们上次介绍的这个hashmset插入数据的顺序和我们的打印输出的顺序是一致的,就是因为我们的这个链表是一个双向的链表,这个节点的顺序就是确定的;

image-20241018163333758

2.linkedhashset源码分析

linkedhashset底层就是linkedhashmap(这个是hashmap的子类);

entry是这个底层的数据类型,table数组是这个node类型的,因此两者之间应该是存在某种关系的,table数组的最开始的大小就是16,和我们之前介绍的这个hashset最开始的空间大小是一样的;

image-20241018191530856

我们的这个每一个数据entry就是我们的这个linkedhashmap的子类,因此我们的这个table数组是node类型的,我们的这个hashmap.node可以通过这个hashmap类进行访问,因此这个node类就是一个静态内部类(不属于对象,而是属于这个类,可以直接使用类进行访问)相当于这个entry是我们的这个hashmap下面的静态内部类node的一个子类;

image-20241018192537094

下面的这个table就是我们的数组node类型的,0表示的就是数组下标entry类型的:

image-20241018193008995

双向链表的节点之间连接方式,在这个调试过程中也是可以看到的,就是这个before和after,在我们插入第一个数据的时候,两个都是空的,当我们插入第二个数据的时候,这个里面的after就已经有了自己的指向,就不是null了,而是指向新的位置;

image-20241018193058168

3.Map的基本介绍

31.基本属性

  • map里面是有类似于这个键值对的内容组成的,key不可以重复,但是不同的key可以对应相同的value数值的;
  • map里面的这个key可以是空的null,value也可以是null,但是我们的这个为null的key只能有一个,这个为null的value可以有多个;
  • 通常情况下我们使用string,但是绝不仅仅只有这个string可以是我们的key,只要是object的子类就可以;
  • 通过map.get方法可以得到这个对应的value数值,例如使用这个map.get(no1)就可以得到这个hsp这个value数值;
  • 当插入的数据的key和已经存在的一样,但是这个value不一样的时候,这个新插入的数据会把原来的这个value替换掉,但是这个key不变化,因为两个是一样的;
  • hashmap属于线程不安全操作;

image-20241018194727736

我们的这个table还是数组,是node类型的,这个里面的数组元素是node类型的;

image-20241018195118025

我们可以看到这个node实际上是实现了这个entry这个接口的,这个静态类里面包含了这个hash,key,value和我们的next指针指向下一个元素;

image-20241018195554756

下面的这个就是数组是node类型的,我们通过转换为这个entry放到这个set里面去,然后这个set里面有这个set(引用)和collection方便对于我们的键和值进行管理;

image-20241018200933520

下面的这个是往这个集合里面添加了两个基本的数据和这个new的对象;

image-20241019092700501

我们可以看到,我们添加基本的数据的时候,还不可以从这个地址上面看到这个引用的关系,但是当我们new这个对象的时候,就会发现这个entryset里面的这个元素的地址和我们的这个table元素的这个对应的地址是一样的,因此可以证明这个就是一个引用的指向关系,这个entryset指向了这个hashmap$node里面的对应的位置;

image-20241019092816267

3.2map里面的集合以及内部数据类型

深度分析:

  • 第一次学习这个entryset的时候,也是非常的迷惑,其实这个entryset就是一个集合,这个结合里面的就是我们的这个entry数据;
  • 我们知道在这个map里面,是有这个key-value组成的,我们下面的介绍就把这个key-value简称为这个k-v;
  • 上面说到的这个entry实际上就是一个k-v,也就是说这个每一个entry都是一个k-v,然后这个所有的k-v组合在一起成为了entry这个集合;
  • 上面的这个叙述转换为编码就是EntrySet<Map.Entry>,其中这个entryset里面的这个定义的类型是map.entry,但是这个实际上的存放的类型还是这个hashmap$node类型的数据;
  • 为什么上面的这一点里面的存放数据的类型和我们的定义类型不一致,这个主要就是因为我们的这个hashmap n o d e 实现了这个 m a p . e n t r y 的接口,因此这个 h a s h m a p node实现了这个map.entry的接口,因此这个hashmap node实现了这个map.entry的接口,因此这个hashmapentry的实例化对象可以赋值给这个hashmap$node的接口(这个是接口的一个规则语法);
  • 也就是说上面的这个图里面,我们的这个hashmap$node是实际存放的数据类型,但是这个会被转换为这个entry数据类型,然后放到我们的这个set里面去即可;
  • 为什么会创建这个entryset集合,这个主要就是因为方便我们程序员进行这个集合的遍历,因为这个entryset里面有这个getValue和getKey的方法;

4.Map接口的常见方法

  • map接口的方法,就是这个往集合里面放进去元素,使用这个put方法;
  • 删除这个map的数据,使用的就是我们的这个remove方法;
  • 清除键值对,可以使用这个clean方法;
  • 可以使用这个iscontainkey判断是不是包含这个键;
  • size方法可以用来获取这个集合里面的entry的个数,其中这个entry就是一个k-v;

image-20241018204744734

5.map里面的遍历的方法

5.1根据key直接遍历

下面的就是使用增强for和迭代器两个方式,通过拿到这个key,使用这个对应的方法得到这个values;

image-20241019091417389

5.2直接拿到这个value值

这个里面就是直接调用这个map.values方法得到这个values数值,然后使用两个方式进行这个结果的打印输出;

image-20241019091623040

5.3使用这个entry遍历

我们下面的这个就是上面介绍的这个实现接口的是类的实例化对象可以传递给这个接口,但是我们需要把这个数据强制转换为这个map.entry类型的;

然后这个entry就可以去调用这个getkey和getvalue方法得到这个对应的键值情况;

image-20241019091716254

6.hashmap扩容转化红黑树的模拟

image-20241019095954599

hashmap扩容原理和之前的这个hahset完全一样;

image-20241019095923870

这个主要是一个怎么样的过程呢?就是:

  • 首先我们进行的这个类的定义的时候,返回值都是这个100,就是为了让他们计算的时候,数据都是在一个table的节点的这个链表上面,然后查看这个扩容的过程;
  • 我们首先就是16个大小,添加这个元素的过程中,会伴随着两次的扩容的过程,一次就是16----32一次就是从这个32------->64的过程;
  • 前面这两个扩容直到64的时候,这个节点的类型都是这个hashmap$node类型的,但是当我们的这个扩容达到了64之后继续插入数据,我们的节点的类型就是下面的这个显示的treenode类型的,这个时候已经是进行了这个红黑树的转化,这个就是树化的过程;
  • 因此在这个元素的添加的过程中,先是进行这个table数组的扩容的操作,然后是这个达到64之后,转换成为这个hashmap$treenode节点类型的红黑树;

image-20241019100240025

7.hashtable底层介绍

  • 底层是这个hashtable$Entry[],初始化的大小是11;
  • hashtable线程安全,不允许是null值;
  • 下面的这个就是我们的hashtable的扩容的时候容量的变化:我们的这个原来的容量<<1表示的就是两倍+1即,这个扩容的过程就是在原来的这个11基础上面进行这个11*2+1=23的操作,因此这个扩容之后的大小就是23;

image-20241019110944896

8.properties介绍

properties是我们的hashtable的子类,里面的这个数据也是k-v,里面数据也不可以是空的数据,如果相同的这个key后插入的这个value也会把原来的替换掉的;

properties通过这个get方法得到一个k-v里面的这个value数值,remove就是删除这个数据,因为两个相同的key也会把原来的value覆盖,因此可以使用插入相同的这个key去修改这个value数据内容;

9.集合的选型规则

学习了这么多的这个集合类型,我们如何进行选择:

首先判断这个是单列还是双列(k-v形式);

单列里面根据这个是否可以进行重复,分为了这个list和set结构,根据这个是否可以进行排序,分为了这个hashset和treeset结构;

在这个双列的结构里面,我们根据这个是不是有序的,是否可以进行排序,分为这个hashmap和treemap结构;

image-20241019112549481

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AJAX——POST 设置请求体参数

1、是在请求体 send 中来设置的 2、参数设置的形式可以以 url 设置参数的形式来设置 ① 用 &#xff1f;分隔 ② 添加参数的名字与参数值&#xff08;中间使用 &#xff09; ③ 有多个参数&#xff0c;各个参数之间用 & 分隔 3、实际上参数设置的内容可以是任意的&…

python爬虫加解密分析及实现

第一种&#xff1a; 1、找到加密的接口地址&#xff0c;通过加密的接口地址全局搜索 2、通过打断点的方式&#xff0c;操作页面&#xff0c;跑到断点处时&#xff0c;即可找到加密串&#xff0c;如图二&#xff1b; 3、找到用的是哪种加密方式&#xff0c;如&#xff1a; cr…

freertos的任务管理

任务函数 任务被实现为C函数。它们唯一特别的地方是它们的原型&#xff0c;它必须返回void并接受void指针参数。以下是函数原型。 void ATaskFunction( void *pvParameters );每个任务本身都是一个小程序。它有一个入口点&#xff0c;通常会在无限循环中永远运行&#xff0c;…

力扣 中等 143.重排链表

文章目录 题目介绍题解 题目介绍 题解 class Solution {public void reorderList(ListNode head) {ListNode mid middleNode(head);ListNode head2 reverseList(mid);while (head2.next ! null) {ListNode nxt head.next;ListNode nxt2 head2.next;head.next head2;head2.…

一次恶意程序分析

首先F12shift查看字符表 字符表发现可疑字符串 双击进入 再tab 进入这里 推测为main函数 可见一些可疑的api FindResourceW推测该木马使用了资源加载 VirtualAlloc申请内存 然后sub_1400796E0 有 dwSize 参数 推测为 拷贝内存 memcpy类似函数 、 然后sub_140078CB0函数 跟进函…

题目 3161: 蓝桥杯2023年第十四届省赛真题-子矩阵

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 1010, mod 998244353; int g[N][N]; int rmin[N][N], rmax[N][N]; ll mmin[N][N], mmax[N][N]; int q[N * N]; int hh, tt; int n, m, a, b; int main() {cin >> n &…

明日周刊-第23期

十月已过半&#xff0c;气温也转凉了&#xff0c;大家注意保温哦。冬吃萝卜&#xff0c;夏吃姜&#xff0c;在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片&#xff0c;现在抓娃娃单次普遍都控制在1块钱以下了&#xff0c;还记得多年前的抓…

鑫方盛携手纷享销客打造工业品采购领域CRM数字样板

鑫方盛集团有限公司(以下简称"鑫方盛")始创于1989年,是国内领先的集数字化平台打造、工业品全品类销售以及国际贸易于一体的一站式工业品服务平台。 集团拥有海内外90多家分公司,年营收超百亿元。为全球十万余家包括加工制造、航天军工、能源电力、钢铁冶金、水利水…

GS-SLAM论文阅读--GSORB-SLAM

前言 文章目录 前言1.背景介绍2.关键内容2.1 建图2.2跟踪2.3总体流程 3.文章贡献4.个人思考 1.背景介绍 3D高斯飞溅&#xff08;3DGS&#xff09;的出现最近引发了密集视觉SLAM研究的新浪潮。然而当前的方法面临着诸如对伪影和噪声的敏感性、训练视点的次优选择以及缺乏全局优…

(小白教程)MPV.NET 播放器安装和添加Bilibili弹幕

MPV.NET安装和添加脚本 MPV跨平台播放器&#xff1a;该播放器基于流行的mpv媒体播放器。mpv.net 设计为与 mpv 兼容&#xff0c;几乎所有 mpv 功能都可用&#xff0c;这意味着官方mpv 手册适用于 mpv.net&#xff0c;差异记录在mpv.net 手册中。 主要差异是mpv.net为MPV添加了现…

c语言经典100例

1.字符串转为数字 #include <stdio.h>int strToInt(char *s) {int num0;int sign1;int step1;if (*s -){sign -1;s;}while (*s > 0&&*s < 9){num num*10(*s-0);step 10;s;}return num*sign; }int main() {char a[10] "-1234";char *s a ;pr…

Spring Boot技术栈的电影评论网站构建

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

Linux中修改和查看Redis的内存大小

目录 一&#xff1a;修改redis内存大小1. 编辑配置文件2. 在命令行修改 二&#xff1a;查看redis内存大小1. get maxmemory2. info memory 一&#xff1a;修改redis内存大小 1. 编辑配置文件 sudo vim /etc/redis/redis.conf maxmemory 300MB1、Redis可用内存大小只能是整数&…

【nlp】知识蒸馏Distilling

一、知识蒸馏介绍 1. 什么是知识蒸馏&#xff1f; 知识蒸馏&#xff08;Knowledge Distillation&#xff09; 是一种用于模型压缩的技术&#xff0c;通过让小模型&#xff08;称为学生模型&#xff0c;student model&#xff09;从大模型&#xff08;称为教师模型&#xff0c;…

无人机初识及应用概览

随着科技的飞速发展&#xff0c;无人机作为一种新兴技术产品&#xff0c;逐渐走进了我们的日常生活和学习中。以下是对该文内容的全面总结&#xff0c;旨在帮助读者更好地理解和认识无人机的基本概念、分类、应用领域、国产标杆品牌以及四旋翼无人机的具体组成。 一、无人机的概…

联邦学习实验复现—MNISIT IID实验 pytorch

联邦学习论文复现&#x1f680; 在精度的联邦学习的论文之后打算进一步开展写一个联邦学习的基础代码&#xff0c;用于开展之后的相关研究&#xff0c;首先就是复现一下论文中最基础也是最经典的MNIST IID(独立同分布划分) 数据集。然后由于这个联邦学习的论文是谷歌发的&#…

html基础小练习

需求&#xff1a;实现如上图网页 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>注册界面</title></head><body><div><form action""><table width"400"><t…

Java21虚拟线程:我的锁去哪儿了?

0 前言 最近的文章中&#xff0c;我们详细介绍了当我们迁移到 Java 21 并将代际 ZGC 作为默认垃圾收集器时&#xff0c;我们的工作负载是如何受益的。虚拟线程是我们在这次迁移中兴奋采用的另一个特性。 对虚拟线程新手&#xff0c;它们被描述为“轻量级线程&#xff0c;大大…

推荐10 个令人惊叹的 Python 自动化脚本!

/01/ 剪贴板管理器 你是否曾发现自己忙于处理多个文本片段&#xff0c;而忘记了自己复制了什么&#xff1f;有没有想过有一个工具可以记录你一天中复制的所有内容&#xff1f; 这个自动化脚本可以监控你复制的所有内容&#xff0c;将复制的每个文本无缝地存储在一个时尚的图形…

C++ 在项目中使用GDB

一&#xff1a;GDB 的 TUI 模式使用 GDB的 TUI &#xff08;Text User Interface&#xff09;模式提供了一种图形化的调试体验&#xff0c;允许在终端中同时显示源代码&#xff0c;寄存器和汇编代码等信息&#xff0c;下面是GDB TUI的基本操作和快捷键 1. 显示源代码窗口&…