Java Set集合

1. Set接口

1.1 Set接口概述

        Set接口继承自Collection接口,所以与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格。

        Set集合的特点是无序且不可重复:

  • 无序:不能保证按照添加元素的顺序来存放元素
  • 不可重复:集合中不能存储两个用equals方法判断为相等的元素

        可以利用Set集合不可重复的特点实现去重操作。

1.2 Set集合示例

        编写代码,测试Set集合的使用。代码示意如下:

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class SetDemo1 {public static void main(String[] args) {List<Integer> list = Arrays.asList(7, 3, 1, 3, 5, 3, 1);// 创建Set集合对象,并将list集合中的元素添加到Set中Set<Integer> set = new HashSet<>(list);System.out.println(set); // 1, 3, 5, 7// 尝试添加重复元素boolean flag = set.add(1);System.out.println("flag: " + flag); // falseSystem.out.println(set); // 1, 3, 5, 7}
}

1.3 集合运算

        Set接口能利用相关方法实现数学上的集合运算,如并、交、差等:

        常用的集合运算方法如下所示:

1.4 集合运算示例

import java.util.*;
public class SetDemo2 {public static void main(String[] args) {List<Integer> list1 = Arrays.asList(1, 2, 3, 4);List<Integer> list2 = Arrays.asList(3, 4, 5, 6);Set<Integer> set1 = new HashSet<>(list1);Set<Integer> set2 = new HashSet<>(list2);System.out.println("set1: " + set1);System.out.println("set2: " + set2);// 求交集set1.retainAll(set2);System.out.println("set1 和 set2 交集:"+set1);// 重置set1set1= new HashSet<>(list1);// 求并集set1.addAll(set2);System.out.println("set1 和 set2 并集:"+set1);// 重置set1set1= new HashSet<>(list1);// 求补集set1.removeAll(set2);System.out.println("set1 和 set2 补集:"+set1);}
}

2. HashSet

2.1 HashSet概述

        HashSet是Java中实现了Set接口的集合类,它使用哈希表作为底层数据结构,用于存储唯一的元素。HashSet不保证元素的顺序,且不允许重复元素。

        HashSet底层实际上是使用HashMap对象来存储数据,如下图所示。

        以下是HashSet的一些特点:

        1、HashSet基于哈希表,使用哈希函数将元素映射到对应的存储位置。

        2、HashSet存储的元素是无序的,即元素的插入顺序与遍历顺序不一致。

        3、HashSet不允许重复元素,每个元素只能出现一次。当尝试将重复元素添加到HashSet时,操作将被忽略。

        4、HashSet的元素可以是任何对象,但需要正确实现hashCode()和equals()方法,以确保元素的唯一性。

        5、HashSet允许使用null作为元素,但只能有一个null元素。

        6、HashSet的插入、删除和查找操作具有常数时间复杂度(平均情况下为O(1)),提供了高效的性能。

2.2 HashSet示例

        编写代码,测试HashSet的使用。代码示意如下:

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;public class HashSetDemo1 {public static void main(String[] args) {Set<Student1> set1 = new HashSet<>();set1.add(new Student1("Tom",18));set1.add(new Student1("Tom",18));System.out.println(set1);Set<Student2> set2 = new HashSet<>();set2.add(new Student2("Tom",18));set2.add(new Student2("Tom",18));System.out.println(set2);}
}class Student1{String name;int age;public Student1(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student1{" +"name='" + name + '\'' +", age=" + age +'}';}
}class Student2{String name;int age;public Student2(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student2 student2 = (Student2) o;return age == student2.age && Objects.equals(name, student2.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic String toString() {return "Student1{" +"name='" + name + '\'' +", age=" + age +'}';}
}

3. 总结

        1、Set 接口继承自 Collection 接口,特点是无序且不可重复。

  • 无序:不能保证按照添加元素的顺序来存放元素
  • 不可重复:集合中不能存储两个用equals方法判断为相等的元素

        2、Set 接口能利用相关方法实现数学上的集合运算,如并、交、差等

  • 并集:s1.addAll(s2)
  • 交集:s1.retainAll(s2)
  • 差集:s1.removeAll(s2)

        3、HashSet 是 Set 接口的一个实现类

  • HashSet 类基于哈希表来存储元素,底层使用 HashMap 来实际存储数据
  • 存入的对象需重写hashCode()方法和equals()方法
  • 可存放null值,但仅会存入1个null值
  • 常用于快速存放不重复元素或元素去重

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

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

相关文章

网卡自动切换AP和AC模式

AC模式搜索不到WiFi AC模式是指client模式&#xff0c;也就是可以自动接入wifi的模式 参考将外置网卡设置为 AP模式之后&#xff0c;发现搜索不到wifi了 &#xff08;换了一台ubuntu测试发现可以&#xff0c;所以不是硬件问题&#xff09; 经过nmcli device status查看设备发…

OCC笔记:图形可视化的实现方式

注&#xff1a;文中参看的occ的源码版本为7.4.0 1、实现思路概览 整体架构 主要有3大块&#xff1a;AIS&#xff08;Application Interactive Services &#xff0c;直译为&#xff1a;应用程序交互服务&#xff09;、Graphics&#xff08;图形&#xff09;、Geometry & T…

2024.05.06作业

自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 #include "yuanshen.h"yuanshen::yuanshen(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(1600,910);this->setFixedSize(1600,910);//窗口标题this-…

【C语言】数据类型

有哪些数据类型&#xff1f; char - 字符数据类型&#xff0c;存储一个字符&#xff0c;大小是1字节。short - 短整型&#xff0c;存储一个整数&#xff0c;大小是2字节。int - 整型&#xff0c;存储一个整数&#xff0c;大小是4字节。long - 长整型&#xff0c;存储一个整数&…

华为 二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

AIGC时代重塑数字安全风控体系

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

VBA编程之条件语句

上一篇我们讲述了条件语句以及分支。文章的最后用到了逻辑运算符“And“那么今天我们来聊一聊逻辑运算符和Select……Case结构。 在学习前我们先来了解一下&#xff0c;在生活中我们经常说”这个包括那个“&#xff0c;”你或者他“&#xff0c;”不是“等等。而这里”包括“和…

SX1308 高效率1.2MHz2A升压稳压器芯片IC

一般说明 该SX1308是一个恒定频率&#xff0c;6引脚SOT23电流模式升压转换器用于小型&#xff0c;低功耗应用。在1.2MHz的SX1308开关&#xff0c;并允许使用微小&#xff0c;低成本的电容器和电感器2毫米或更低的高度内部软启动小浪涌电流的结果&#xff0c;延长电池寿命…

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入&#xff0c;各个组件、微服务的数量、深度在不断增加。由于算网是个人项目&#xff0c;我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻&#xff0c;所以MVP的内容还是在不断变化&…

基于数字证书的移动终端金融安全身份认证规范

基于数字证书的移动终端金融安全身份认证规范 1 范围 本文件规定了基于数字证书的移动终端金融安全身份认证的服务描述、移动终端生命周期管理、服 务生命周期管理、密钥管理、安全及功能、风险控制和运营管理的要求。 本文件适用于银行业金融机构、非银行支付机构&#xff0c…