HashSet 的基本操作【集合容器知识回顾 ④】

HashSet 是 Java 中的一个集合类,它实现了 Set 接口。Set 是一种不允许包含重复元素的集合,而 HashSet 则是 Set 接口的一个具体实现。因此,HashSet 用于存储一组唯一的元素,不允许重复

HashSet 的一些特点:

  • 不允许重复元素:如果试图向 HashSet 中添加重复的元素,重复元素将被忽略。
  • 无序性:HashSet 不保证元素的顺序,元素在 HashSet 中是无序的。
  • 允许 null 元素:HashSet 可以包含一个 null 元素。

基本操作

创建和初始化HashSet
Set<String> fruits = new HashSet<>();
Set<String> set = new HashSet<>(List.of("a","b","c","a"))
添加元素
Set<String> fruits = new HashSet<>();
fruits.add("苹果");
fruits.add("香蕉");
fruits.add("梨子");
删除元素
fruits.remove("苹果");
判断元素是否存在
fruits.contains("苹果");
获取集合大小
fruits.size();
遍历HashSet
// 迭代器遍历
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()){System.out.println(iterator.next());
}// 增强for遍历
for (String fruit : fruits){System.out.println(fruit);
}// lambda 遍历
fruits.forEach(f->System.out.println(f));
求交集差集
HashSet<Integer> set1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
HashSet<Integer> set2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));// 求交集
boolean b = set1.retainAll(set2);// 求差集
boolean b1 = set1.removeAll(set2);
转换为数组
String[] fruitsArray = fruits.toArray(new String[0]);
转换为其他集合类型
// 转换为其他集合类型
Set<String> set3 = new HashSet<>(List.of("a","b","c","a"));
ArrayList<String> arrayList = new ArrayList<>(set3);
LinkedList<String> linkedList = new LinkedList<>(set3);
比较两个HashSet
Set<String> set4 = new HashSet<>(Arrays.asList("a","b","c","d"));
Set<String> set5 = new HashSet<>(Arrays.asList("a","b","c","d"));
boolean isEquals = set4.equals(set5);
将自定义对象作为HashSet的元素,重写HashCode和equals

比如,有一个People类,将多个People对象传入到Set中,然后希望的结果是,只要idCard身份证号不同,就表示people不同,即名字相同并不是重复的元素。

People 类 (没有重写hashCode和equals方法):

package com.robin._collections;public class People {private String name;private String sex;private String idCard;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard = idCard;}public People(String name, String sex, String idCard) {this.name = name;this.sex = sex;this.idCard = idCard;}public People() {}@Overridepublic String toString() {return "People{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", idCard='" + idCard + '\'' +'}';}
}

下面的代码中,HashSet并未对我们自定义的People类按照预期的方式去重,原因就是每个People对象的哈希值不同,所以HashSet认为每个对象都是不同的,但是实际情况并不是这样,这时候就需要我们重写hashCode和equals方法了。

Set<People> peopleSet = new HashSet<>();
People p1 = new People("张三","男","2001000");
People p2 = new People("王五","男","2001001");
People p3 = new People("李四","男","2001013");
People p4 = new People("李四","男","2001013");
People p5 = new People("李四","男","2001016");
peopleSet.add(p1);
peopleSet.add(p2);
peopleSet.add(p3);
peopleSet.add(p4);
peopleSet.add(p5);peopleSet.forEach(people -> System.out.println(people));

1706773796192.png

重写hashCode和equals方法,我们只需要比较idCard这个字段即可,将下面的代码添加到People类中,然后再次测试HashSet的结果

@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;People people = (People) o;return Objects.equals(idCard, people.idCard);
}@Override
public int hashCode() {return Objects.hash(idCard);
}

此时HashSet已经能够按照我们的想法去对自定义类型进行去重了。

image.png

小结

HashSet 的性能通常是很高的,它提供了快速的插入、删除和查询操作。

添加元素的性能:HashSet 的添加元素操作通常是很快的,但性能可能会随着负载因子的增加而下降。负载因子是一个衡量哈希表填充程度的参数,默认值是 0.75。当负载因子超过一定阈值时,HashSet 会进行扩容操作,这可能会导致性能下降。

查询元素的性能:HashSet 提供了快速的查询操作,因为它使用哈希表来存储元素,可以快速定位元素位置。

删除元素的性能:删除元素的性能通常也很高,与查询操作类似,可以快速定位要删除的元素。

HashSet 不允许添加重复元素,自动去重。

HashSet 不保证元素的顺序,元素在HashSet中是无序的。

当将自定义对象作为HashSet对象时,需要重写hashCode() 和 equals()方法,以保证对象在集合中的唯一性和正确性。

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

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

相关文章

漏洞03-CSRF漏洞

CSRF漏洞 文章目录 CSRF CSRF

链式二叉树(1)

目录 二叉树的概念&结构 二叉树的遍历概念 手写二叉树测试 二叉树遍历实现代码 递归图解 前序遍历递归图解 中序序遍历递归图解 后续遍历递归图解 二叉树的概念&结构 二叉树是&#xff1a; 空树非空&#xff1a;根节点&#xff0c;根节点的左子树、根节点的右子…

3ASC25H216A DATX132

3ASC25H216A DATX132 3ASC25H216A DATX132 3ASC25H216A DATX132在DAQ应用中使用非隔离DC/DC电源降压模块的优势 "... 图3&#xff1a;德州仪器电源模块电感HTS性能 此外&#xff0c;我们的电源 ... 响应。 图4&#xff1a;功率模块效率和负载瞬态响应 若保持 ...…

Java设计模式-组合模式(13)

大家好,我是馆长!今天开始我们讲的是结构型模式中的组合模式。老规矩,讲解之前再次熟悉下结构型模式包含:代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式、组合模式,共7种设计模式。 组合模式(Composite Pattern) 定义 组合(Composite)模式:又叫…

【开源】基于Qt5的ROS1/ROS2人机交互软件(支持地图编辑/多点导航)

本项目基于Qt5开发&#xff0c;基于CMake进行构建&#xff0c;可以实现一套代码同时在ROS1/ROS2系统中使用(本项目已接入CI,保证多ROS版本/系统版本可用性) 项目地址&#xff1a; https://github.com/chengyangkj/Ros_Qt5_Gui_App 软件在编译时会自动识别环境变量中的ROS1/ROS…

如何对视频进行翻译

下载视频和翻译软件 视频和翻译软件点击下载就行了&#xff0c;下载之后解压&#xff0c;然后把两个exe点一下。接下来如果资金充裕或者要求比较高的可以使用各个api&#xff0c;网站里有视频介绍了。 经济适用视频翻译 原理简析 首先这个软件对视频的翻译的流程大致如下&a…

【GameFramework框架】一、框架介绍

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog…

tableau绘制雷达图

目标图形: 1. 数据准备 &#xff08;1&#xff09;原始数据 你要进行用雷达图比较的对象的各指标的数据。 (2) 处理后数据 在原数据的基础上添加对各指标进行区间的划分数据&#xff0c;也就是层级的划分。 2. 操作步骤 &#xff08;1&#xff09;数据转化 转化前&#xf…

Backtrader 文档学习- Broker - Cheat-On-Open

Backtrader 文档学习- Broker - Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说&#xff0c;这似乎是一个必需的功能&#xff0c;用bar的收盘价后进行计算&#xff0c;希望与开盘价相匹配。 当开盘价差距&#xff08;上涨或下跌&#xff0c;取…

streampark+flink一键整库或多表同步mysql到doris实战

streamparkflink一键整库或多表同步mysql到doris实战&#xff0c;此应用一旦推广起来&#xff0c;那么数据实时异构时&#xff0c;不仅可以减少对数据库的查询压力&#xff0c;还可以减少数据同步时的至少50%的成本&#xff0c;还可以减少30%的存储成本&#xff1b; streampar…

Vue.js 学习14 集成H265web.js播放器实现webpack自动化构建

Vue.js 学习14 集成H265web.js播放器实现webpack自动化构建 一、项目说明1. H265web.js 简介2. 准备环境 二、项目配置1. 下载 H265web.js2. 在vue项目里引入 H265web3. 设置 vue.config.js 三、代码引用1. 参照官方demo &#xff0c; 创建 executor.js2. 在 vue 页面里引用htm…

K8S网络

一、介绍 k8s不提供网络通信&#xff0c;提供了CNI接口(Container Network Interface&#xff0c;容器网络接口)&#xff0c;由CNI插件实现完成。 1.1 Pod通信 1.1.1 同一节点Pod通信 Pod通过虚拟Ethernet接口对&#xff08;Veth Pair&#xff09;与外部通信&#xff0c;Veth…

有向图查询所有环,非递归

图&#xff1a; 有向图查询所有环&#xff0c;非递归&#xff1a; import java.util.*;public class CycleTest {private final int V; // 顶点数private final List<List<Integer>> adjList; // 邻接表public CycleTest(int vertices) {this.V vertices;this.…

C++ : 类的简单介绍(四)——析构函数

概念&#xff1a; 与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象销毁工作是由 编译器完成的。 而对象在销毁时会自动调用析构函数&#xff0c;完成对象中资源的清理工作。 特征&#xff1a; 1. 析构函数名是在类名前加上字符 ~ 2. …

java+springboot电影订票选座及评论网站影评系统ssm+vue

广大观影消费者需要知道自己的空闲时间&#xff0c;在自己可以接受的地理距离范围内&#xff0c;是否有感兴趣的影片可供观看&#xff0c;也需要清楚哪家影院在销售自己需要的电影票&#xff1b;同时手握电影排期及上映信息的电影院的运营者也急需根据消费者的观影需求实时调整…

【笔记】CSDN文本编辑操作(持续更新中......)

文章目录 1、修改字体颜色和字号2、首行悬进两个字符3、图片居中4、字体、文字颜色、居中5、高亮6、重点标注7、加粗 1、修改字体颜色和字号 <html><head><meta http-equiv"Content" content"text/html;charsetutf-8" /><title>修…

互联网医院开发:未来医疗的新篇章

随着科技的飞速发展&#xff0c;互联网已经深入到我们生活的方方面面&#xff0c;而医疗领域也不例外。近年来&#xff0c;互联网医院的发展已经成为医疗行业的新趋势&#xff0c;为患者提供了更为便捷、高效的医疗服务。本文将探讨互联网医院开发的重要性、技术实现以及未来发…

王道_数据结构 1.2_2_算法的时间复杂度

1.2_2_算法的时间复杂度 一、为什么要事先预估算法时间开销二、时间复杂度的计算与技巧1、化简“算法时间开销”的计算方式的依据2、常用技巧&#xff08;1&#xff09;加法、乘法规则&#xff08;2&#xff09;时间复杂度的数量级阶数排行 3、计算时间复杂度的结论与步骤&…

TMC电池供电方案推荐

静音、小巧、精确、高效的构建模块改变了电机在电池供电设备中的使用方式。从恒温散热器阀&#xff0c;到现实捕捉设备和电动工具&#xff0c;再到医疗健康应用&#xff0c;激发丰沛想象力&#xff0c;将可靠概念运用于电池供电设备&#xff0c;为消费者和专业人士带来便利。 …

Klocwork 2023.4发布:问题匹配算法升级,编码标准全面支持!

Klocwork 2023.4 的新增功能 Klocwork 2023.4 改进了问题匹配的算法&#xff0c;为桌面端和CI集成构建之间的结果提供了更大的一致性&#xff0c;以及连续构建之间的问题匹配。Klocwork的最新版本还改进了C/C语言的分析引擎&#xff0c;减少了误报/漏报&#xff0c;跨过程跟踪…