Java基础 Day20

一、HashSet 集合类

1、简介

HashSet 集合底层采取哈希表存储数据

底层是HashMap

不能使存取有序

JDK8之前的哈希表是数组和链表,头插法

JDK8之后的哈希表是数组、链表和红黑树,尾插法

2、存储元素

(1)如果要保证元素的唯一性,需要同时重写对象中的 hashCode 方法和 equals 方法

因为Object类的hashCode方法是调用底层的C++代码计算了一个随机数

(2)hashCode方法计算哈希值,equals方法比较元素

当添加对象的时候, 会先调用对象的hashCode方法计算出一个应该存入的索引位置, 查看该位置上是否存在元素

不存在:直接存

存在:调用equals方法比较内容

false:存

true:不存

3、底层原理细节(JDK8及以后)

(1)哈希扰动

底层会先计算出原始哈希值,设为 h

计算 h ^ ( h >> 16 ) 作为新的哈希值

以减少哈希冲突

(2)取模运算

用最终的哈希值对底层数组长度取模,得到索引位置

初始数组长度为16

计算时,并不是直接 H % 16

而是 ( 16 - 1 ) & H

对16取模相当于取后四位,和1111做与运算也是取后四位

与运算的效率高于取模运算

(3)数组扩容与树化操作

扩容数组的条件:

当数组中的元素个数到达了 16 * 0.75 (加载因子) = 12,扩容到原数组 2 倍的大小

链表挂载的元素超过了8 (阈值) 个 , 并且数组长度没有超过64

链表转红黑树的条件:

链表挂载的元素超过了8 (阈值) 个, 并且数组长度到达了64

二、LinkedHashSet 集合类

1、简介

存取有序、去重、无索引

2、原理

底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序

三、几种单列集合的选择

1、元素可重复,用 ArrayList(最常用)

2、元素可重复,且增删多于查询,用LInkedList

3、元素不重复,用HashSet(最常用)

4、不重复且存取有序,用LinkedHashSet

5、想对元素排序,用TreeSet

四、可变参数

可变参数用在形参中可以接收多个数据

可变参数的格式:数据类型...参数名称

传输参数非常灵活,方便,可以不传输参数,可以传输1个或者多个,也可以传输一个数组

可变参数在方法内部本质上就是一个数组

注意:一个形参列表中可变参数只能有一个,可变参数必须放在形参列表的最后面

public static void main(String[] args) {System.out.println(add(1)); // 1System.out.println(add(1,2,3)); // 6int[] arr = {1,2,3,4};System.out.println(add(arr)); // 10
}public static int add(int... nums) {int sum = 0;for (int num : nums) {sum += num;}return sum;
}

五、Collections 集合工具类

Collections并不属于集合,是用来操作集合的工具类

public static <T> boolean addAll(Collection<? super T> c, T... elements)

给集合对象批量添加元素

public static void shuffle(List<?> list) 

打乱List集合元素的顺序

public static <T> int binarySearch (List<T> list,  T key)

以二分查找法查找元素

public static <T> void max/min(Collection<T> coll)

根据默认的自然排序获取最大/小值

public static <T> void swap(List<?> list, int i, int j)

交换集合中指定位置的元素

public static <T> void sort(List<T> list)

将集合中元素按照默认规则排序

public static <T> void sort(List<T> list,Comparator<? super T> c)

将集合中元素按照指定规则排序

六、Map 接口

1、Map 集合

Map 集合是一种双列集合,每个元素包含两个数据

Map 集合的每个元素的格式:key = value(键值对元素)

key (键):不允许重复

value (值):允许重复

键和值是一一对应的,每个键只能找到自己对应的值

key + value 这个整体称为“键值对”或者“键值对对象”,在Java中使用Entry对象表示

2、常用方法

Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的

V put(K key,V value)

添加元素,若键已存在,则覆盖原值,返回被覆盖的值

V remove(Object key)

根据键删除键值对元素

void clear()

移除所有的键值对元素

boolean containsKey(Object key)

判断集合是否包含指定的键

boolean containsValue(Object value)

判断集合是否包含指定的值

boolean isEmpty()

判断集合是否为空

int size()

集合的长度,也就是集合中键值对的个数

3、特点

双列集合底层的数据结构都是针对于键有效,和值无关

HashMap:键唯一(重写hashCode方法和equals方法)

TreeMap:键排序(实现comparable接口并重写compareTo方法)

LinkedHashMap:键唯一且存取有序

4、遍历方式

(1)通过键找值

V get(Object key) 

根据键查找对应的值

Set<K> keySet() 

获取 Map 集合中所有的键

(2)通过键值对对象获取键和值

Set<Map.Entry<K,V>> entrySet() 

获取集合中所有的键值对对象

(3)通过 forEach 方法遍历

default void forEach​

(BiConsumer<? super K, ? super V> action) 

遍历Map集合, 获取键和值

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

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

相关文章

2505C++,32位转64位

原文 假设有个想要将一个32位值传递给一个带64位值的函数的函数.你不关心高32位的内容,因为该值是传递给回调函数的直通值,回调函数会把它截断为32位值. 因此,你都担心编译器一般生成的将32位值扩展到64位值的那条指令的性能影响. 我怀疑这条指令不是程序中的性能瓶颈. 我想出…

光伏电站及时巡检:守护清洁能源的“生命线”

在“双碳”目标驱动下&#xff0c;光伏电站作为清洁能源的主力军&#xff0c;正以年均20%以上的装机增速重塑全球能源格局。然而&#xff0c;这些遍布荒漠、屋顶的“光伏矩阵”并非一劳永逸的能源提款机&#xff0c;其稳定运行高度依赖精细化的巡检维护。山东枣庄触电事故、衢州…

C++初阶-list的使用2

目录 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函数的简单介绍 基本用法 函数原型 使用函数对象作为谓词 使用普通函数作为谓词 注意事项 复杂对象示例 2.2remove与remove_if的简单使用 3.std::list::unique的使用 …

OpenHarmony平台驱动使用(一),ADC

OpenHarmony平台驱动使用&#xff08;一&#xff09; ADC 概述 功能简介 ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#…

CSS【详解】弹性布局 flex

适用场景 一维&#xff08;行或列&#xff09;布局 基本概念 包裹所有被布局元素的父元素为容器 所有被布局的元素为项目 项目的排列方向&#xff08;垂直/水平&#xff09;为主轴 与主轴垂直的方向交交叉轴 容器上启用 flex 布局 将容器的 display 样式设置为 flex 或 i…

基于MATLAB实现传统谱减法以及两种改进的谱减法(增益函数谱减法、多带谱减法)的语音增强

基于MATLAB实现传统谱减法以及两种改进的谱减法&#xff08;增益函数谱减法、多带谱减法&#xff09;的语音增强代码示例&#xff1a; 传统谱减法 function enhanced traditional_spectral_subtraction(noisy, fs, wlen, inc, NIS, a, b)% 参数说明&#xff1a;% noisy - 带…

symbol【ES6】

你一闭眼世界就黑了&#xff0c;你不是主角是什么&#xff1f; 目录 什么是Symbol&#xff1f;‌Symbol特点‌&#xff1a;创建方法&#xff1a;注意点&#xff1a;不能进行运算&#xff1a;显示调用toString() --没有意义隐式转换boolean 如果属性名冲突了怎么办&#xff1f;o…

LeetCode 649. Dota2 参议院 java题解

https://leetcode.cn/problems/dota2-senate/description/ 贪心。不会写。 class Solution {public String predictPartyVictory(String senate) {boolean rtrue,dtrue;int flag0;//flag>0,d前面有r;flag<0,r前面有dchar[] senatessenate.toCharArray();//每一轮while(r…

机器学习第二十二讲:感知机 → 模仿大脑神经元的开关系统

机器学习第二十二讲&#xff1a;感知机 → 模仿大脑神经元的开关系统 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 感知机详解…

maven快速上手

之前我们项目如果要用到其他额外的jar包&#xff0c;需要自己去官网下载并且导入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代码配置即可&#xff0c;配置好后maven会自动帮我们联网下载并且会自动导入该jar包 在右边的maven中&#xff0c;我们可以看到下载安装…

科学养生指南:解锁健康生活密码

健康是人生最宝贵的财富&#xff0c;在快节奏的现代生活中&#xff0c;科学养生成为保持良好状态的关键。遵循现代医学与营养学的研究成果&#xff0c;无需依赖传统中医理论&#xff0c;我们也能找到适合自己的养生之道。​ 均衡饮食是健康的基石。现代营养学强调 “食物多样&…

Qt状态机QStateMachine

QStateMachine QState 提供了一种强大且灵活的方式来表示状态机中的状态&#xff0c;通过与状态机类(QStateMachine)和转换类(QSignalTransition&#xff0c; QEventTransition)结合&#xff0c;可以实现复杂的状态逻辑和用户交互。合理使用嵌套状态机、信号转换、动作与动画、…

C++八股 —— 原子操作

文章目录 1. 什么是原子操作2. 原子操作的特点3. 原子操作的底层原理4. 内存序内存屏障 5. 原子操作和互斥锁的对比6. 常用的原子操作7. 相关问题讨论 参考&#xff1a; C atomic 原子操作_c 原子操作-CSDN博客DeepSeek 1. 什么是原子操作 原子操作&#xff08;Atomic Opera…

双紫擒龙紫紫红指标源码学习,2025升级版紫紫红指标公式-重点技术

VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 双紫擒龙:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…

NeuralRecon技术详解:从单目视频中实现三维重建

引言 三维重建是计算机视觉领域中的一项关键技术&#xff0c;它能够从二维图像中恢复出三维形状和结构。随着深度学习的发展&#xff0c;基于学习的方法已经成为三维重建的主流。NeuralRecon是一种先进的三维重建方法&#xff0c;它能够从单目视频中实时生成高质量的三维模型。…

Ubuntu 上开启 SSH 服务、禁用密码登录并仅允许密钥认证

1. 安装 OpenSSH 服务 如果尚未安装 SSH 服务&#xff0c;运行以下命令&#xff1a; sudo apt update sudo apt install openssh-server2. 启动 SSH 服务并设置开机自启 sudo systemctl start ssh sudo systemctl enable ssh3. 生成 SSH 密钥对&#xff08;本地机器&#xf…

MySQL 索引的增删改查

MySQL 索引的增删改查 1 建表时创建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [别名] (字段名 [(长度)] [ASC|DESC] )主键直接写&#xff1a; PRIMARY KEY (Id)例如&#xff1a; CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…

为什么现代CSS应该选择OKLCH:从颜色科学到设计系统革新

在数字界面中&#xff0c;颜色不仅是美学的载体&#xff0c;更是信息传递的重要工具。CSS Color Level 4 标准引入了 OKLCH 颜色空间, 提供​​感知均匀性​​&#xff08;颜色差异与实际视觉感受一致&#xff09;&#xff0c;解决传统HSL/HSV在调整颜色时的不自然问题。文本帮…

【java】小练习--零钱通

文章目录 前言一、项目开发流程说明二、功能实现2.1 菜单2.2 零钱通明细2.3 零钱通收益2.4 零钱通消费2.5 零钱通退出确认2.6 零钱通金额校验2.7 完整代码 三、零钱通OOP版 前言 本文是我跟着B站韩顺平老师的 Java 教程学习时动手实现“零钱通”项目的学习笔记&#xff0c;主要…

人工智能数学基础实验(四):最大似然估计的-AI 模型训练与参数优化

一、实验目的 理解最大似然估计&#xff08;MLE&#xff09;原理&#xff1a;掌握通过最大化数据出现概率估计模型参数的核心思想。实现 MLE 与 AI 模型结合&#xff1a;使用 MLE 手动估计朴素贝叶斯模型参数&#xff0c;并与 Scikit-learn 内置模型对比&#xff0c;深入理解参…