【学习集合--Set】
学习内容:
- Set集合概述
- Set集合实现—HashSet
- LinkedHashSet和TreeSet
学习产出:
Set集合概述
Set中不存在值相同的节点。将两个对象e1.equals(e2),如果结果为true,或者(e1==e2)内存地址相等,就认为两个对象相等。
这也是Map集合中判断两个对象是否相同的标准,下面是HashMap集合判断Key键对象是否一致的源码
//如果两个key键的地址相同或者是equals方法返回trueif (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))
需要知道的是,java集合框架中很多Set的内部结构都是依赖于对应的map实现的。
同样Set集合也有几个重要的接口和抽象类
java.util.SortedSet接口
一般情况下,Set集合中的数据对象是无序的,是因为HashSet的内部结构决定的—HashSet集合的内部结构和HashMap集合相同。HashSet也实现了java.util.SortedSet接口,所以提供了两种比较方法,一个是根据key的信息,在这种情况下,key必须实现Comparable接口,第二种就是通过集合实例化时传入的comparator比较器进行比较。如果两种都不能用会抛出异常(ClassCastException)
注意java.util.Comparator和java.util.Comparable接口的区别
- 实现Comparator接口的类类似一个工具,可以对传入的两个参数进行比较,所以该接口中需要被实现的compare(T o1, T o2)有两个不同的参数
- Comparable该接口可以解释为类对象本身就是可以比较的,也就是说实现该接口的类本身就是可以进行比较的,所以compareTo(T o)只有一个入参
javaNavigableSet接口
该接口是SortedSet的子级接口。作用是在满足集合有序的前提下,可以参照指定的数据对象进行集合中各数据对象的读写工作,例如可以参照已经有的X,查询所有权值比X大或者小的数据对象
源码如下
public interface NavigableSet<E> extends SortedSet<E> {//返回小于指定对象的值,并且最大的数据对象,没有返回空E lower(E e);//和lower相同,不过是小于等于E floor(E e);//大于或者等于E ceiling(E e);//大于E higher(E e);//返回并且删除最小的数据对象E pollFirst();//返回删除最大的E pollLast();//返回一个迭代器Iterator<E> iterator();//返回这个有序集合的反序集合NavigableSet<E> descendingSet();//反序迭代器Iterator<E> descendingIterator();//返回两个对象中间的集合,两个boolean是是否包含from和toNavigableSet<E> subSet(E fromElement, boolean fromInclusive,E toElement, boolean toInclusive);//小于to的集合对象,inclusive是否包含的toNavigableSet<E> headSet(E toElement, boolean inclusive);//大于NavigableSet<E> tailSet(E fromElement, boolean inclusive);//这个默认是前闭后开SortedSet<E> subSet(E fromElement, E toElement);SortedSet<E> headSet(E toElement);SortedSet<E> tailSet(E fromElement);}
需要注意的是如果我们向这个子集添加元素,该元素也会添加到父集合中,但是如果向子集添加的元素超过子集的范围会抛异常。
java.util.AbstractSet抽象类
作用和AbstractMap类似,提供了一些公用方法
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {protected AbstractSet() {}//如果两个内存地址相同,则认为相同,如果不是同一种set对象返回false,如果容量不同返回false//集合中所有对象存在当前集合中返回true,其他情况返回falsepublic boolean equals(Object o) {if (o == this)return true;if (!(o instanceof Set))return false;Collection<?> c = (Collection<?>) o;if (c.size() != size())return false;try {return containsAll(c);} catch (ClassCastException | NullPointerException unused) {return false;}}public int hashCode() {int h = 0;Iterator<E> i = iterator();while (i.hasNext()) {E obj = i.next();if (obj != null)h += obj.hashCode();}return h;}public boolean removeAll(Collection<?> c) {Objects.requireNonNull(c);boolean modified = false;if (size() > c.size()) {for (Object e : c)modified |= remove(e);} else {for (Iterator<?> i = iterator(); i.hasNext(); ) {if (c.contains(i.next())) {i.remove();modified = true;}}}return modified;}}
Set集合实现—HashSet
需要知道的是HashSet是基于HashMap原理进行工作的,HashSet集合的元素不是有序的
主要属性
//存储数据的map,但是并不参与集合序列化的过程private transient HashMap<E,Object> map;//当题解数据时,每一个常量都用该常量填充private static final Object PRESENT = new Object();
构造方法
public HashSet() {map = new HashMap<>();}//参照一个指定集合进行初始化,初始化容量是 源集合容量的175%和16取大的public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}//指定初始容量和负载因子public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}//指定初始化容量,负载因子默认为0.75public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}
LinkedHashSet和TreeSet
LinkedHashSet继承HashSet集合,而TreeSet内部结构和TreeMap内部结构相同,所以TreeSet内部也是红黑树
LinkedHashSet十分简单不在介绍
TreeSet集合
主要属性和构造方法
private transient NavigableMap<E,Object> m;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();//这个就是以来的ma集合,看似是NavigableMap抽象类,实际上TreeMap集合private transient NavigableMap<E,Object> m;//该构造方法访问级别为包保护,外部调用者无法直接调用TreeSet(NavigableMap<E,Object> m) {this.m = m;}public TreeSet() {this(new TreeMap<>());}//传入一个比较器,并且为内部的TreeMap导入这个比较器public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}//参照其他集合构造初始化public TreeSet(Collection<? extends E> c) {this();addAll(c);}//参照一个实现了SortedSet的集合public TreeSet(SortedSet<E> s) {this(s.comparator());addAll(s);}
TreeSet集合主要依赖方法
public boolean add(E e) {return m.put(e, PRESENT)==null;}public boolean remove(Object o) {return m.remove(o)==PRESENT;}public void clear() {m.clear();}public E first() {return m.firstKey();}/*** @throws NoSuchElementException {@inheritDoc}*/public E last() {return m.lastKey();}public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,E toElement, boolean toInclusive) {return new TreeSet<>(m.subMap(fromElement, fromInclusive,toElement, toInclusive));}
相关文章:
【学习集合--Set】
学习内容: Set集合概述Set集合实现—HashSet LinkedHashSet和TreeSet 学习产出: Set集合概述 Set中不存在值相同的节点。将两个对象e1.equals(e2),如果结果为true,或者(e1e2)内存地址相等,就认为两个对象…...
函数的参数
函数的默认实参 函数默认参数:函数的形参可以有默认值,如果我们自己传入参数,就用自己的数据,如果没有,那么用默认值 特别注意*: 如果某个位置有了默认参数,那么从这个位置往后,必…...
数组(八)-- LC[53][152] 最大子数组之和与乘积最大子数组
1 最大子数组之和 1.1 题目描述 题目链接:https://leetcode.cn/problems/maximum-subarray/ 1.2 求解思路 1. 暴力法 class Solution:def maxSubArray(self, nums: List[int]) -> int:length len(nums)max_sum float(-inf)for i in range(length):sum_sub_…...
docker2-zabbix
安装最新版docker yum remove docker docker-common docker-selinux docker-engine yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum list docker-ce --showduplicates | sort -r yum install docke…...
ctcdecode安装
1.下载 https://pan.baidu.com/s/1sZMbzzYtBoT35zHtDifVqQ ,提取码:a05y。然后解压到ctcdecode文件夹中。 感谢 ctcdecode安装_huangneng0219的博客-CSDN博客 提供。 然后build.py文件中的compile_args [-O3, -DKENLM_MAX_ORDER6, -stdc11, -fPIC] …...
虚树学习小记
虚树是什么 虚树指在原树上选择需要的点和它们的LCALCALCA组成的一棵树。这样可以使在树DP时顶点数更少,从而减少时间复杂度。一般用于有多组数据且能保证所有数据访问的点的和不超过规定范围。 情景代入:SDOI2011消耗战 SDOI2011消耗战 题目大意 给…...
【C++】特殊类设计(单例模式)
文章目录一、设计模式概念二、设计一个不能被拷贝的类三、设计一个只能在堆上创建对象的类3.1 私有构造3.2 私有析构四、设计一个只能在栈上创建对象的类五、设计不能被继承的类六、单例模式❗️❗️6.1 饿汉模式6.2 懒汉模式6.2.1 线程安全问题6.2.2 新写法一、设计模式概念 …...
基于YOLOv5的水下海洋目标检测
摘要:水下海洋目标检测技术具有广泛的应用前景,可以用于海洋环境监测、海洋资源开发、海洋生物学研究等领域。本文提出了一种基于 YOLOv5 的水下海洋目标检测方法,使用数据增强方法进行了大量实验,并与其他方法进行了对比…...
磁盘这列(Raid)
RAID介绍 RAID技术通过把多个硬盘设备组合成一个容量更大的、安全性更好的磁盘阵列。把数据切割成许多区段后分别放在不同的物理磁盘上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数据的副本同步到不同的物理设备上,从而…...
Oracle之PL/SQL存储过程与函数练习题(七)
1.创建一个存储过程,以员工号为参数,输出该员工的工资2.创建一个存储过程,以员工号为参数,修改该员工的工资。若该员工属于10号部门,则工资增加150;若属于20号部门,则工资增加200;若…...
C++入门教程||C++ 基本的输入输出||C++ 数据结构
C 基本的输入输出 C 基本的输入输出 C 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C 编程中最基本和最常见的 I/O 操作。 C 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、…...
线性表——顺序表
文章目录一:线性表二:顺序表1:概念与结构1:静态顺序表2:动态顺序表2:动态顺序表的代码实现1:结构2:接口实现1:初始化2:释放内存3:检查容量4&#…...
第六章 Vite4+Vue3+Vtkjs 模型颜色切换、漫反射曲面颜色
一、介绍 💥 💥 Vtk里面工具非常的齐全,但是相关的文档又少之又少,只能花大量时间去阅读源码。漫反射曲面颜色是什么意思呢,Vtk可以使用漫反射曲面颜色来模拟光线在表面反射时的颜色。漫反射是一种光线与表面发生碰撞后,被散射到各个方向的现象,这种现象可以用来解释物…...
【QT学习七】QTreeWidget
目录 一、QTreeWidget 概述 二、QTreeWidget 的基本使用 2.1、创建 QTreeWidget 控件 2.2、设置 QTreeWidget 的大小和位置 2.3、设置 QTreeWidget 的列数和列标题 2.4、添加节点 2.5、读取节点 2.6、设置节点数据 2.7、自定义节点样式 三、注意事项 四、完整示例 一…...
【Linux】组管理和权限管理
目录1 Linux组的基本介绍2 文件/目录所有者2.1 查看文件的所有者2.2 修改文件所有者3 组的创建3.1 基本指令3.2 应用实例4 文件/目录 所在组4.1 查看文件/目录所在组4.2修改文件/目录所在的组5 其他组6 改变用户所在组6.1 改变用户所在的组6.2 应用实例7 权限介绍8 rwx权限详解…...
从零到一发布 NPM 包
如果你负责前端的基础能力建设,发布各种功能/插件包犹如家常便饭,所以熟悉对 npm 包的发布与管理是非常有必要的,故此有了本篇总结文章。本篇文章一方面总结,一方面向社区贡献开箱即用的 npm 开发、编译、发布、调试模板ÿ…...
uniapp国际化配置
1、创建资源文件 创建一个locale文件夹,新增index.js,en.json,zh-hans.json 2.配置locale文件夹中的index.js文件 import Vue from vue import VueI18n from vue-i18n// v8.x import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from .…...
前端中 try-catch 捕获不到哪些异常和常见错误
在开发过程中,我们的目标是 0error,0warning。 但有很多因素并不是我们可控的,为了避免某块代码的错误,影响到其他模块或者整体代码的运行,我们经常会使用try-catch模块来主动捕获一些异常或者错误。 比如我们在获取…...
javaEE 初阶 — 如何构造一个 HTTP 请求
文章目录使用 form 表单标签构造1 构造 GET 请求2 构造 POST 请求使用 ajax 构造1 什么是异步2 代码中如何使用 ajax使用第三方工具构造1 postman 工具的安装2 postman 工具的使用使用 form 表单标签构造 1 构造 GET 请求 使用 form 表单构造 HTTP 请求,需要用到两…...
CentOS 7下安装PostgreSQL 15版本数据库(图文详细)
文章目录CentOS 7下安装PostgreSQL 15版本数据库(图文详细)1 简介1.1 概述1.2 官网2 PostgreSQL安装2.1 选定版本2.2 安装依赖2.3 执行安装2.4 初始化2.5 配置环境变量2.6 创建数据库2.6.1 进入命令行2.6.2 创建DB2.6.3 设置密码2.7 配置远程2.8 测试链接3 pgAdmin4工具安装3.1…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
