当前位置: 首页 > news >正文

【学习集合--Set】

学习内容:

  1. Set集合概述
  2. Set集合实现—HashSet
  3. 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】

学习内容&#xff1a; Set集合概述Set集合实现—HashSet LinkedHashSet和TreeSet 学习产出&#xff1a; Set集合概述 Set中不存在值相同的节点。将两个对象e1.equals(e2),如果结果为true&#xff0c;或者&#xff08;e1e2&#xff09;内存地址相等&#xff0c;就认为两个对象…...

函数的参数

函数的默认实参 函数默认参数&#xff1a;函数的形参可以有默认值&#xff0c;如果我们自己传入参数&#xff0c;就用自己的数据&#xff0c;如果没有&#xff0c;那么用默认值 特别注意*&#xff1a; 如果某个位置有了默认参数&#xff0c;那么从这个位置往后&#xff0c;必…...

数组(八)-- LC[53][152] 最大子数组之和与乘积最大子数组

1 最大子数组之和 1.1 题目描述 题目链接&#xff1a;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 &#xff0c;提取码&#xff1a;a05y。然后解压到ctcdecode文件夹中。 感谢 ctcdecode安装_huangneng0219的博客-CSDN博客 提供。 然后build.py文件中的compile_args [-O3, -DKENLM_MAX_ORDER6, -stdc11, -fPIC] …...

虚树学习小记

虚树是什么 虚树指在原树上选择需要的点和它们的LCALCALCA组成的一棵树。这样可以使在树DP时顶点数更少&#xff0c;从而减少时间复杂度。一般用于有多组数据且能保证所有数据访问的点的和不超过规定范围。 情景代入&#xff1a;SDOI2011消耗战 SDOI2011消耗战 题目大意 给…...

【C++】特殊类设计(单例模式)

文章目录一、设计模式概念二、设计一个不能被拷贝的类三、设计一个只能在堆上创建对象的类3.1 私有构造3.2 私有析构四、设计一个只能在栈上创建对象的类五、设计不能被继承的类六、单例模式❗️❗️6.1 饿汉模式6.2 懒汉模式6.2.1 线程安全问题6.2.2 新写法一、设计模式概念 …...

基于YOLOv5的水下海洋目标检测

摘要&#xff1a;水下海洋目标检测技术具有广泛的应用前景&#xff0c;可以用于海洋环境监测、海洋资源开发、海洋生物学研究等领域。本文提出了一种基于 YOLOv5 的水下海洋目标检测方法&#xff0c;使用数据增强方法进行了大量实验&#xff0c;并与其他方法进行了对比&#xf…...

磁盘这列(Raid)

RAID介绍 RAID技术通过把多个硬盘设备组合成一个容量更大的、安全性更好的磁盘阵列。把数据切割成许多区段后分别放在不同的物理磁盘上&#xff0c;然后利用分散读写技术来提升磁盘阵列整体的性能&#xff0c;同时把多个重要数据的副本同步到不同的物理设备上&#xff0c;从而…...

Oracle之PL/SQL存储过程与函数练习题(七)

1.创建一个存储过程&#xff0c;以员工号为参数&#xff0c;输出该员工的工资2.创建一个存储过程&#xff0c;以员工号为参数&#xff0c;修改该员工的工资。若该员工属于10号部门&#xff0c;则工资增加150&#xff1b;若属于20号部门&#xff0c;则工资增加200&#xff1b;若…...

C++入门教程||C++ 基本的输入输出||C++ 数据结构

C 基本的输入输出 C 基本的输入输出 C 标准库提供了一组丰富的输入/输出功能&#xff0c;我们将在后续的章节进行介绍。本章将讨论 C 编程中最基本和最常见的 I/O 操作。 C 的 I/O 发生在流中&#xff0c;流是字节序列。如果字节流是从设备&#xff08;如键盘、磁盘驱动器、…...

线性表——顺序表

文章目录一&#xff1a;线性表二&#xff1a;顺序表1&#xff1a;概念与结构1&#xff1a;静态顺序表2&#xff1a;动态顺序表2&#xff1a;动态顺序表的代码实现1&#xff1a;结构2&#xff1a;接口实现1&#xff1a;初始化2&#xff1a;释放内存3&#xff1a;检查容量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 包

如果你负责前端的基础能力建设&#xff0c;发布各种功能/插件包犹如家常便饭&#xff0c;所以熟悉对 npm 包的发布与管理是非常有必要的&#xff0c;故此有了本篇总结文章。本篇文章一方面总结&#xff0c;一方面向社区贡献开箱即用的 npm 开发、编译、发布、调试模板&#xff…...

uniapp国际化配置

1、创建资源文件 创建一个locale文件夹&#xff0c;新增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 捕获不到哪些异常和常见错误

在开发过程中&#xff0c;我们的目标是 0error&#xff0c;0warning。 但有很多因素并不是我们可控的&#xff0c;为了避免某块代码的错误&#xff0c;影响到其他模块或者整体代码的运行&#xff0c;我们经常会使用try-catch模块来主动捕获一些异常或者错误。 比如我们在获取…...

javaEE 初阶 — 如何构造一个 HTTP 请求

文章目录使用 form 表单标签构造1 构造 GET 请求2 构造 POST 请求使用 ajax 构造1 什么是异步2 代码中如何使用 ajax使用第三方工具构造1 postman 工具的安装2 postman 工具的使用使用 form 表单标签构造 1 构造 GET 请求 使用 form 表单构造 HTTP 请求&#xff0c;需要用到两…...

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…...

基于Vite与原生JS构建现代化个人站点导航器

1. 项目概述&#xff1a;一个现代站点导航器的诞生最近在整理自己的浏览器书签和常用工具链接时&#xff0c;我又一次陷入了混乱。收藏夹里塞满了各种项目文档、在线工具、技术博客和设计资源&#xff0c;每次想找一个特定的网站&#xff0c;都得在层层文件夹里翻找半天。这让我…...

Win11Debloat免费工具:3步彻底清理Windows 11垃圾,性能提升51%

Win11Debloat免费工具&#xff1a;3步彻底清理Windows 11垃圾&#xff0c;性能提升51% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes …...

如何像管理代码一样构建个人技能树:从知识管理到职业发展

1. 项目概述与核心价值最近在整理个人知识库和技能树时&#xff0c;发现了一个挺有意思的项目&#xff0c;叫mxyhi/ok-skills。乍一看&#xff0c;这像是一个个人仓库&#xff0c;但深入探究后&#xff0c;我发现它远不止是一个简单的代码托管。它更像是一个结构化的个人能力发…...

鸿蒙 HarmonyOS 6.0 页面构建实践:跨端数字图书馆界面实现

鸿蒙 HarmonyOS 6.0 页面构建实践&#xff1a;跨端数字图书馆界面实现 前言 随着移动互联网和物联网的高速发展&#xff0c;跨端应用开发已成为现代软件开发的重要趋势。开发者不仅需要在手机端提供流畅的用户体验&#xff0c;还需要兼顾平板、电视等多终端的适配问题。在这样的…...

VisualHMI LUA脚本中get_float与set_float函数实战详解

1. 项目概述&#xff1a;从界面到逻辑的桥梁在工业HMI&#xff08;人机界面&#xff09;开发中&#xff0c;我们常常会遇到一个看似简单却至关重要的需求&#xff1a;如何让屏幕上显示的一个数值&#xff0c;与背后控制器&#xff08;如PLC&#xff09;里的一个浮点数寄存器精准…...

Next.js 14全栈样板工程解析:集成Prisma与NextAuth的现代Web开发实践

1. 项目概述&#xff1a;一个为现代Web应用量身定制的启动器如果你正在寻找一个能让你跳过繁琐的初始化配置&#xff0c;直接进入核心业务逻辑开发的Next.js项目起点&#xff0c;那么nemanjam/nextjs-prisma-boilerplate这个项目很可能就是你需要的。这不是一个简单的“Hello W…...

立创泰山派RK3566开发环境实战:从交叉编译到高效文件传输

1. 立创泰山派RK3566开发环境搭建全攻略 第一次拿到立创泰山派RK3566开发板时&#xff0c;我和大多数嵌入式开发者一样兴奋又忐忑。这款基于Rockchip RK3566处理器的开发板性能强劲&#xff0c;但配套资料相对分散&#xff0c;特别是对于从其他平台&#xff08;比如我熟悉的IMX…...

PyInstaller Extractor技术实现与逆向分析实践

PyInstaller Extractor技术实现与逆向分析实践 【免费下载链接】pyinstxtractor PyInstaller Extractor 项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor PyInstaller Extractor是一个专门用于提取PyInstaller生成的可执行文件内容的Python工具。该工具能够…...

Robotics Toolbox for Python架构解析与工程实践指南

Robotics Toolbox for Python架构解析与工程实践指南 【免费下载链接】robotics-toolbox-python Robotics Toolbox for Python 项目地址: https://gitcode.com/gh_mirrors/ro/robotics-toolbox-python Robotics Toolbox for Python是一个面向机器人算法开发者和研究人员…...

注册新会员页面

最终效果初始代码第一步&#xff1a;设置导航菜单第二步&#xff1a;设置基本信息&#xff08;必填&#xff09;第三步&#xff1a;设置其他信息&#xff08;选填&#xff09;完整的代码<!DOCTYPE html> <html><head><title>注册新会员</title>&…...