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

Java基础 - 07 Set之Set,AbstractSet

上边几篇,我们对java的List集合进行相关介绍,了解了关于List集合下的相关实现类的方法或者接口。

自本篇开始,将围绕java的Set进行介绍,也是对我java知识的巩固吧,处理业务越多,发现自己对基础知识的薄弱,于是又回头继续学习,没办法,学习就是这样,忘记又学,学了又忘,听他们说,把东西理解了,并掺杂自己的想法就不会忘记了,我也不知道是不是真的,算了废话不多说了,开始介绍Set集合了;

Set集合

在这里插入图片描述

Set作为Java中的一个接口,它继承自Collection接口,用于存储不重复的元素, Set不保证元素的顺序,且不允许包含重复元素。

Set的特点包括:

  • 不允许重复的元素: set中的元素是唯一的,如果试图向Set中添加重复的元素,则添加操作将被忽略。

  • 具备无序性: Set中的元素没有固定的顺序,不同的实现类可能以不同的方式存储和遍历元素。

  • 具备高效性: Set提供了高效的元素查找和插入操作,通常使用哈希表或者树等数据结构来实现。

在这里插入图片描述

Set定义的常用的方法,例如

  • 添加元素:add(element):向Set中添加指定元素。
  • 删除元素:remove(element):从Set中移除指定元素。
  • 判断是否包含元素:contains(element):判断Set中是否包含指定元素。
  • 获取元素个数:size():返回Set中元素的个数。
  • 清空Set:clear():移除Set中的所有元素。
  • 遍历Set:可以使用迭代器或增强for循环来遍历Set中的元素。
public static void main(String[] args) {Set<String> set = new HashSet<>();// 添加元素set.add("apple");set.add("banana");set.add("orange");set.add("apple"); // 重复元素,将被忽略// 判断是否包含元素System.out.println(set.contains("apple")); // 输出:trueSystem.out.println(set.contains("grape")); // 输出:false// 获取元素个数System.out.println(set.size()); // 输出:3// 遍历Setfor (String element : set) {System.out.println(element);}// 删除元素set.remove("banana");// 清空Setset.clear();}

注意一下,Set重写了equals和hashCode方法。

用途:

  • 去重:当需要从一组数据中去除重复元素时,可以使用Set来存储数据,因为Set会自动去除重复元素。

  • 查找:由于Set内部使用哈希表或树等数据结构实现,查找操作的时间复杂度为O(1)或O(log n),因此在需要快速查找元素的场景下,Set是一个很好的选择。

  • 数学集合运算:Set提供了一些集合运算的方法,如交集、并集、差集等,可以方便地进行集合操作。

Set的优点:

  • 去重功能:Set保证元素的唯一性,可以自动去除重复元素,简化了去重操作。
  • 高效的查找和插入操作:Set的底层实现通常使用哈希表或树等数据结构,使得查找和插入操作具有高效性。
  • 提供了集合运算方法:Set提供了一些集合运算的方法,方便进行集合操作。

Set的缺点:

  • 无序性:Set中的元素没有固定的顺序,无法按照特定的顺序进行访问和遍历。

  • 不支持索引访问:Set接口不提供索引访问元素的方法,无法通过索引直接访问元素,需要使用迭代器或其他方式进行遍历。

  • 内存占用较大:由于Set需要保证元素的唯一性,可能需要额外的内存空间来存储哈希值或比较元素,因此在存储大量数据时,可能会占用较多的内存。

举例说明

交集(Intersection):获取两个Set中共同存在的元素。
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8));Set<Integer> intersection = new HashSet<>(set1);
intersection.retainAll(set2);System.out.println(intersection); // 输出:[4, 5]

创建了两个Set,分别包含一些整数元素。然后,我们创建一个新的Set ntersection,并将其初始化为set1的副本。接下来,我们使用retainAll()方法将intersectionset2取交集,最终得到的结果是[4, 5],即两个Set中共同存在的元素。

并集(Union):获取两个Set中所有的不重复元素。
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8));Set<Integer> union = new HashSet<>(set1);
union.addAll(set2);System.out.println(union); // 输出:[1, 2, 3, 4, 5, 6, 7, 8]

我们创建了两个Set,分别包含一些整数元素。然后,我们创建一个新的Set union,并将其初始化为set1的副本。接下来,我们使用addAll()方法将set2中的元素添加到union中,最终得到的结果是[1, 2, 3, 4, 5, 6, 7, 8],即两个Set中所有的不重复元素。

差集(Difference):获取在第一个Set中存在但在第二个Set中不存在的元素。
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8));Set<Integer> difference = new HashSet<>(set1);
difference.removeAll(set2);System.out.println(difference); // 输出:[1, 2, 3]

我们创建了两个Set,分别包含一些整数元素。然后,我们创建一个新的Set difference,并将其初始化为set1的副本。接下来,我们使用removeAll()方法将set2中的元素从difference中移除,最终得到的结果是[1, 2, 3],即在第一个Set中存在但在第二个Set中不存在的元素。

在这里插入图片描述

AbstractSet< E >

AbstractSet是一个抽象类,它实现了Set接口的大部分方法,提供了一些通用的实现,使得编写自定义的Set实现类变得更加简单。
在这里插入图片描述

在这里插入图片描述

相关方法

add(E e):向集合中添加指定的元素。默认实现会抛出UnsupportedOperationException异常,因此,具体的子类需要重写该方法来实现添加元素的逻辑。addAll(Collection<? extends E> c):将指定集合中的所有元素添加到当前集合中。默认实现会遍历指定集合,并逐个调用add()方法来添加元素。clear():从集合中移除所有的元素。默认实现会遍历集合,并逐个调用remove()方法来移除元素。contains(Object o):判断集合是否包含指定的元素。默认实现会遍历集合,并逐个调用equals()方法来比较元素。containsAll(Collection<?> c):判断集合是否包含指定集合中的所有元素。默认实现会遍历指定集合,并逐个调用contains()方法来判断元素是否存在。equals(Object o):判断当前集合是否与指定对象相等。默认实现会比较集合的大小和元素是否相同。hashCode():返回当前集合的哈希码值。默认实现会遍历集合,并累加每个元素的哈希码值。isEmpty():判断集合是否为空。默认实现会判断集合的大小是否为0。iterator():返回一个用于遍历集合的迭代器。默认实现会返回AbstractSet的内部类Iterator的实例。remove(Object o):从集合中移除指定的元素。默认实现会遍历集合,并逐个调用equals()方法来比较元素。removeAll(Collection<?> c):从集合中移除指定集合中的所有元素。默认实现会遍历指定集合,并逐个调用remove()方法来移除元素。retainAll(Collection<?> c):仅保留集合中与指定集合中相同的元素,移除其他元素。默认实现会遍历集合,并逐个调用contains()方法来判断元素是否存在。size():返回集合中的元素个数。默认实现会遍历集合并计数。toArray():将集合转换为数组。默认实现会创建一个新的数组,并将集合中的元素复制到数组中。

案例

AbstractSet在Java中的作用是为自定义的Set实现类提供了一些通用的方法实现,简化了编写Set实现类的过程。通过继承AbstractSet,我们只需要关注实现自定义的Set特有的方法,而无需重复编写已经在AbstractSet中实现的方法。

public class MySet<E> extends AbstractSet<E> {private Object[] elements;private int size;public MySet() {elements = new Object[10];size = 0;}@Overridepublic boolean add(E e) {if (contains(e)) {return false;}if (size >= elements.length) {// 扩容数组Object[] newElements = new Object[elements.length * 2];System.arraycopy(elements, 0, newElements, 0, size);elements = newElements;}elements[size++] = e;return true;}@Overridepublic Iterator<E> iterator() {return new MySetIterator();}@Overridepublic int size() {return size;}private class MySetIterator implements Iterator<E> {private int cursor;@Overridepublic boolean hasNext() {return cursor < size;}@Overridepublic E next() {if (!hasNext()) {throw new NoSuchElementException();}return (E) elements[cursor++];}}
}

我们创建了一个名为MySet的自定义Set实现类,它继承自AbstractSet。我们只需要实现add()、iterator()和size()这三个抽象方法,而其他方法如contains()、remove()等已经在AbstractSet中实现了。

在MySet中,我们使用一个数组elements来存储集合中的元素,size表示集合的大小。在add()方法中,我们首先判断元素是否已经存在于集合中,如果存在则返回false,否则将元素添加到数组中。如果数组已满,则扩容数组。在iterator()方法中,我们返回一个内部类MySetIterator的实例,用于遍历集合中的元素。在size()方法中,我们直接返回集合的大小。

相关文章:

Java基础 - 07 Set之Set,AbstractSet

上边几篇&#xff0c;我们对java的List集合进行相关介绍&#xff0c;了解了关于List集合下的相关实现类的方法或者接口。 自本篇开始&#xff0c;将围绕java的Set进行介绍&#xff0c;也是对我java知识的巩固吧&#xff0c;处理业务越多&#xff0c;发现自己对基础知识的薄弱&…...

C++17新特性(三)新的标准库组件

1. optional 在编程时&#xff0c;我们经常会遇到可能会返回/传递/使用一个确定类型对象的场景。也就是说&#xff0c;这个对象可能有一个确定类型的值也可能没有任何值。因此&#xff0c;我们需要一种方法来模拟类似指针的语义&#xff1a;通过nullptr表示指针为空。解决方法…...

Spring Boot入门

SpringBoot介绍 什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其中“Boot”的意思就是“引导”&#xff0c;Spring Boot 并不是对 Spring 功能上的增强&#xff0c;而是提供了一种快速开发 Spring应用的方式。 特点 • 嵌入的 Tomcat&#xff0c…...

【LeetCode】数学精选4题

目录 1. 二进制求和&#xff08;简单&#xff09; 2. 两数相加&#xff08;中等&#xff09; 3. 两数相除&#xff08;中等&#xff09; 4. 字符串相乘&#xff08;中等&#xff09; 1. 二进制求和&#xff08;简单&#xff09; 从字符串的右端出发向左做加法&#xff0c;…...

【漏洞复现】Hikvision SPON IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 Hikvision Intercom Broadcasting System是中国海康威视&#xff08;Hikvision&#xff09;公司的一个对讲广播系统。 声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…...

IDEA在重启springboot项目时没有自动重新build

IDEA在重启springboot项目时没有自动重新build 问题描述 当项目里面某些依赖或者插件更新了&#xff0c;target的class文件没有找到&#xff0c;导致不是我们需要的效果。 只能手动的清理target文件&#xff0c;麻烦得很 &#xff0c; 单体项目还好说&#xff0c;一次清理就…...

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1&#xff1a; sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1&#xff1a; sys int g0/0/0 ip add…...

48-DOM节点,innerHTML,innerText,outerHTML,outerText,静态获取,单机click,cssText

1.DOM基础 Document Object Module,文档对象模型,window对象,document文档,都可以获取和操作 1)文档节点 2)属性节点(标签内的属性href,src) 3)文本节点(标签内的文字) 4)注释节点 5)元素节点(标签) 2.获取元素节点 2.1通过标签名获取getElementsByTagName() …...

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.data为数据集&a…...

【欢迎您的到来】这里是开源库get_local_info作者的付费专栏

您好&#xff0c; 我是带剑书生&#xff0c;开源库get_local_info的作者&#xff0c;欢迎您的到来&#xff0c;这里是我的付费专栏&#xff0c;在上一个付费专栏里&#xff0c;用简洁的语言&#xff0c;通俗的话语&#xff0c;帮助您更好的学习了Rust&#xff0c;现在将用本专栏…...

Java SE入门及基础(23)

目录 方法带参 1. 构造方法带参 案例场景 思考&#xff1a;以上代码存在什么问题&#xff1f; 2. 方法带参 方法带参语法 案例场景 思考&#xff1a;以上代码存在什么问题&#xff1f; Java SE文章参考:Java SE入门及基础知识合集-CSDN博客 方法带参 1. 构造方法带参 …...

蓝桥杯回文日期判断

思想&#xff1a;对于回文数的判断方法&#xff0c;最快的就是取其中一半的字符串长度&#xff0c;为s&#xff0c;然后将其进行翻转为s’ &#xff0c;再把两者进行拼接即可保证是回文数&#xff0c;这样子就解决了枚举所有回文数的问题。 注意点&#xff1a; 要求必须是有效…...

Qt文件和目录相关操作

1.相关说明 QCoreApplication类、QFile类、QDir、QTemporaryDir类、QTemporaryFile类、QFileSystemWatcher类的相关函数 2.相关界面 3.相关代码 #include "dialog.h" #include "ui_dialog.h" #include <QFileDialog> #include <QTemporaryDir>…...

递归、搜索与回溯算法(专题一:递归)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 接下来我会用几道题&#…...

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…...

ChatGPT给出的前端面试考点(Vue.js)

ChatGPT给出的前端面试考点&#xff08;Vue.js&#xff09; 答案 1. Vue.js是什么&#xff1f;它的主要特点是什么&#xff1f; Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它的主要特点包括&#xff1a; 数据绑定&#xff1a;Vue.js使用双向数据绑定&…...

ChatGPT 商业提示词攻略书

原文&#xff1a;ChatGPT Business Prompt Playbook 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、书系介绍 人工智能发展迅速。非常迅速。 所以我希望你做两件事&#xff1a; (1) 在 Twitter 上关注我&#xff1a;iamkylebalmer (2) 订阅我的免费电子邮件通…...

Notepad++运行C语言输出乱码

方法一&#xff1a;编码-编码字符集-中文-GB2312 这时原程序中文会变成乱码&#xff0c;我是重新输入中文 重新编译执行即可 缺陷&#xff1a;重开一个程序有中文还是会显示乱码&#xff0c;需要重新设置编码&#xff0c;比较麻烦 方法二&#xff1a;设置-首选项-新建-右侧编…...

深入解析 Java 方法引用:Lambda 表达式的进化之路

前言 方法引用是 Java 8 提供的一种新特性&#xff0c;它允许我们更简洁地传递现有方法作为参数。这项特性实际上是对 Lambda 表达式的一种补充&#xff0c;通过方法引用&#xff0c;我们可以直接引用现有方法&#xff0c;而无需编写完整的Lambda表达式。最近在使用方法引用的…...

MySQL作业 (3)多表查询

多表查询 1.创建student和score表2.为student表和score表增加记录3.查询student表的所有记录4.查询student表的第2条到4条记录5.从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;name&#xff09;和院系&#xff08;department&#xff09;的信息6.…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...