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

news2024/12/24 22:15:26

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() {
    }

    @Override
    public 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.coloradmin.cn/o/1424924.html

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

相关文章

揭开时间序列的神秘面纱:特征工程的力量

目录 写在开头1. 什么是特征工程?1.1 特征工程的定义和基本概念1.2 特征工程在传统机器学习中的应用1.3 时间序列领域中特征工程的独特挑战和需求3. 时间序列数据的特征工程技术2.1 数据清洗和预处理2.1.1 缺失值处理2.1.2 异常值检测与处理2.2 时间特征的提取2.2.1 时间戳解析…

Vue中使用定义的函数时,无法访问到data()里面的数据

const translateItems1 () > {this.translatedItems this.items1.map(item > {return {...item,label: this.$t(item.labelKey)};}); items1是我们data()里面的数据&#xff0c;无法访问到 解决办法 把箭头函数替换为普通函数 const translateItems1 function() {th…

echarts 鼠标移入有单位;echarts 纵坐标有单位;echarts 纵坐标刻度有单位

1.echarts 鼠标移入有单位 tooltip series: [{name: "平均值",type: "line",data: this.avgData,tooltip: {valueFormatter: function (value) {return value 万元}}}]2.echarts 纵坐标有单位&#xff1b;name yAxis: [{type: "value",name: t…

为什么贪婪的 GPU需要快速的对象存储?

一个链条的力量取决于其最薄弱的环节 - 同样&#xff0c;您的AI/ML基础设施的速度也只有您的最慢组件那么快。如果您使用GPU训练机器学习模型&#xff0c;那么您的薄弱环节可能是您的存储解决方案。结果就是我所说的“饥饿GPU问题”。 饥饿GPU问题发生在您的网络或存储解决方案…

三、软硬件工作流程分析

现在的计算机主要是由两部分组成&#xff1a;软件系统和硬件系统。这里先捋清楚硬件和软件的关系&#xff0c;以及电脑 各个组成部分是如何配合工作的。 软件系统主要被分类为两大类&#xff1a; 系统软件&#xff1a;这包括操作系统&#xff0c;如Windows、Linux等。操作系统是…

ManticoreSearch-(安装配置,集群搭建)-学习总结

ManticoreSearch-(安装配置)-学习总结 基础概念安装搭建集群搭建(基于K8S) 原文地址 https://blog.csdn.net/liuyij3430448/article/details/135955025 基础概念 Manticore Search是一个专门为搜索设计的多存储数据库&#xff0c;具有强大的全文搜索功能&#xff0c;适用于…

力扣hot100 三数之和 双指针 细节去重

Problem: 15. 三数之和 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code ⏰ 时间复杂度: O ( n 2 ) O(n^2) O(n2) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public List<List<Integer>> threeSum(int[] nums){List&l…

composer常用命令

查看全局配置信息 composer config -gl 设置镜全局像地址 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 去掉-g&#xff0c;即表示只有当前项目使用该镜像 批量安装composer项目依赖 composer install 执行该命令后&#xff0c;会读取当…

算法练习-二叉树的层序遍历(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

EasyExcel根据对应的实体类模板完成多个sheet的写入与读取

1.展示模板一的实体类 import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowH…

软件价值3-A*算法寻路

A*算法&#xff08;A-star算法&#xff09;是一种启发式搜索算法&#xff0c;主要用于在图或网络中找到从起始节点到目标节点的最佳路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优优先搜索的特点&#xff0c;通过估算从起始节点到目标节点的代价来指导搜索方向。 A*算法…

CentOS 8最小安装

简介 CentOS 8的IOS如果下载DVD版本至少有10G 这里我们直接选择最小安装&#xff0c;因此选择最小系统boot版本 CentOS-8.5.2111-x86_64-boot.iso 下载地址 https://mirrors.aliyun.com/centos/8.5.2111/isos/x86_64/ 直接选择CentOS-8.5.2111-x86_64-boot.iso 大小只有789.0…

MIT6.5830 实验0

前置 本次实验使用 Golang 语言实现&#xff0c;在之前的年份中&#xff0c;都是像 cs186 那样使用 Java 实现。原因&#xff1a; Golang 语言作为现代化语言&#xff0c;简单易上手但功能强大。 使参加实验的同学有同一起跑线&#xff0c;而不是像Java那样&#xff0c;有些同…

鸿蒙HarmonyOS——AVSession开发指导

AVSession开发指导 说明&#xff1a; AVSession的所有接口均为系统接口&#xff0c;其功能仅提供给系统应用使用。 会话接入端开发指导 基本概念 会话元数据AVMetadata: 媒体数据相关属性&#xff0c;包含标识当前媒体的ID(assetId)&#xff0c;上一首媒体的ID(previousAsset…

链式二叉树(1)

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

基于MongoDB实现聊天记录的存储

一、mongodb简介 1.1 mongodb简介 MongoDB是一个基于分布式文件存储的数据库&#xff0c;使用C语言编写。它旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB介于关系数据库和非关系数据库之间&#xff0c;是非关系数据库当中功能最丰富、最像关系数据库的。 Mong…

【TCP】三次握手(建立连接)

前言 在网络通信的世界里&#xff0c;可靠传输协议&#xff08;TCP&#xff09;扮演着重要的角色&#xff0c;它保证了数据包能够按顺序、完整地从发送端传送到接收端。TCP协议中有一个至关重要的机制——三次握手。这一过程确保了两个TCP设备在开始数据传输之前建立起一个稳定…

计算机毕业设计 | SpringBoot 房屋租赁网 房屋租赁平台(附源码)

1&#xff0c;绪论 1.1 背景调研 在房地产行业持续火热的当今环境下&#xff0c;房地产行业和互联网行业协同发展&#xff0c;互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能&#xff0c;多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…

【Linux】环境基础开发工具的使用(一)

前言&#xff1a;在此之前我们学习了一些Linux的权限&#xff0c;今天我们进一步学习Linux下开发工具的使用。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4af;代码仓库:卫卫周大胖的学习日记…

长时间佩戴骨传导耳机会损害听力吗?骨传导耳机有什么优点?

如果是正常的使用&#xff0c;是不会对损伤听力的&#xff0c;如果错误的使用&#xff0c;比如说高音量使用&#xff0c;长时间也会出现一定的危害&#xff0c;而且骨传导耳机相比于传统耳机&#xff0c;其优点也要多一些&#xff0c;下面一起看下骨传导耳机都有哪些优点吧。 佩…