Java中的Set(如果想知道Java中有关Set的知识点,那么只看这一篇就足够了!)

news2024/11/25 19:51:24

        前言:在Java编程中,集合框架(Collections Framework)是处理数据结构和算法的基础工具之一。它提供了一套强大且灵活的接口和类,用于存储和操作不同类型的数据集合。在这其中,Set接口扮演着一个重要角色。与其他集合类型如ListMap不同,Set强调的是集合中元素的唯一性。这使得它在需要去重、快速查找等场景下显得尤为重要。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

先让我们看一下本文大致的讲解内容:

目录

1.Set概念的简介

        (1)Set的定义

        (2)Set类在Java集合类中的关系

2.Set接口中常用的API

        (1)boolean add(E e)

        (2)void clear()

        (3)boolean contains(Object o)

        (4)Iterator iterator()

        (5)boolean remove(Object o)

        (6)int size()

        (7)boolean isEmpty()

        (8)Object[] toArray()

        (9)boolean containsAll(Collection c)

        (10)boolean addAll(Collection c)

3.Set的常见实现类

        (1)HashSet

        (2)LinkedHashSet

        (3)TreeSet

4.Set的实际案例

        (1)去除重复元素

        (2)查找集合的交集、并集和差集

        (3)判断两个集合是否相等

5.总结


1.Set概念的简介

        (1)Set的定义

        在Java中,Set接口是Java集合框架的一部分,用于表示一组唯一的元素。与List不同,Set不允许包含重复的元素。这意味着即使尝试将相同的元素添加多次,Set中也只会保留一个实例。Set接口继承自Collection接口,因此它也拥有一些集合框架中通用的方法。

        Set的主要特点:

  1. 无序性Set中的元素没有特定的顺序,这意味着你不能通过索引来访问Set中的元素。
  2. 唯一性Set中的每个元素都是唯一的,即不能包含重复的元素。
  3. 允许null值:大多数Set实现都允许包含一个null值,但不能有多个null值。

        我相信读者如果初次学习Java中的Set类的话,可能对上面对Java中Set类的解释不能够很好的理解,不过没有关系,读者继续向下阅读即可。

        (2)Set类在Java集合类中的关系

        了解了Set类的基本定义之后,现在再让我们看看Set类在Java的集合框架中的的关系,如下图:

        从上图我们可以得知,Java中的Set类也实现了Collection接口,那么Set类也就实现了Collection接口中的方法,即可以使用其中的方法。

        ——至此,通过上边的学习了解之后,这样我们就大致的了解了Java中的Set究竟是什么东西了。

2.Set接口中常用的API

        在Java中,Set是继承自Collection的接口类,但是相较于Java中的Map类,Set中只存储了Key,所以对于Set而言,其方法大都是操作其中的Key的,以下是Set接口的主要方法:

方法解释
boolean add(E e)添加元素,但重复元素不会被添加成功
void clear()清空集合
boolean contains(Object o)判断 o 是否在集合中
Iterator<E> iterator()返回迭代器
boolean remove(Object o)删除集合中的 o
int size()返回set中元素的个数
boolean isEmpty()检测set是否为空,空返回true,否则返回false
Object[] toArray()将set中的元素转换为数组返回
boolean containsAll(Collection<?> c)集合c中的元素是否在set中全部存在,是返回true,否则返回
false
boolean addAll(Collection<? extends
E> c)
将集合c中的元素添加到set中,可以达到去重的效果

这里我们对上述方法进行逐一使用代码进行实例解释:

        (1)boolean add(E e)

        ——向集合中添加指定的元素。如果集合中不存在该元素,则返回true;如果集合中已存在该元素,则返回false

import java.util.HashSet;
import java.util.Set;

public class AddExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        boolean added1 = set.add("Apple");
        boolean added2 = set.add("Banana");
        boolean added3 = set.add("Apple"); // 尝试添加重复元素

        System.out.println(set);
    }
}

输出:

[Apple, Banana]

        (2)void clear()

        ——移除集合中的所有元素,使集合变为空集。

import java.util.HashSet;
import java.util.Set;

public class ClearExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");

        System.out.println("Set before clear: " + set);
        set.clear();
        System.out.println("Set after clear: " + set);
    }
}

输出:

Set before clear: [Apple, Banana, Cherry]
Set after clear: []

        (3)boolean contains(Object o)

        ——如果集合中包含指定的元素,则返回true;否则返回false

import java.util.HashSet;
import java.util.Set;

public class ContainsExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");

        boolean containsApple = set.contains("Apple");
        boolean containsCherry = set.contains("Cherry");

        System.out.println("Set contains 'Apple': " + containsApple);
        System.out.println("Set contains 'Cherry': " + containsCherry);
    }
}

输出:

Set contains 'Apple': true
Set contains 'Cherry': false

        (4)Iterator<E> iterator()

        ——返回在集合中的元素上进行迭代的迭代器。

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class IteratorExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");

        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}

输出:

Apple
Banana
Cherry

        (5)boolean remove(Object o)

        ——从集合中移除指定的元素。如果集合中存在该元素,则返回true;否则返回false

public class RemoveExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");

        boolean removed = set.remove("Banana");
        boolean notRemoved = set.remove("Cherry");

        System.out.println(set);
        System.out.println(removed);
        System.out.println(notRemoved);
    }
}

输出:

[Apple]
true
false

        (6)int size()

        ——返回集合中元素的数量。

import java.util.HashSet;
import java.util.Set;

public class SizeExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");

        int size = set.size();
        System.out.println("Set size: " + size);
    }
}

输出:

Set size: 3

        (7)boolean isEmpty()

        ——如果集合不包含任何元素,则返回true;否则返回false

public class IsEmptyExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();

        boolean isEmptyBeforeAdd = set.isEmpty();
        set.add("Apple");
        boolean isEmptyAfterAdd = set.isEmpty();

        System.out.println(isEmptyBeforeAdd);
        System.out.println(isEmptyAfterAdd);
    }
}

输出:

true
false

        (8)Object[] toArray()

        ——返回包含集合中所有元素的数组。

import java.util.HashSet;
import java.util.Set;

public class ToArrayExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");

        Object[] array = set.toArray();
        for (Object element : array) {
            System.out.println((String) element);
        }
    }
}

输出:

Apple
Banana
Cherry

        (9)boolean containsAll(Collection<?> c)

        ——如果集合包含指定集合中的所有元素,则返回true;否则返回false

public class ContainsAllExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");

        List<String> list = Arrays.asList("Apple", "Banana");

        boolean containsAll = set.containsAll(list);
        System.out.println(containsAll);
    }
}

输出:

true

        (10)boolean addAll(Collection<? extends E> c)

        ——将指定集合中的所有元素添加到集合中。如果集合因调用而发生改变,则返回true

import java.util.HashSet;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

public class AddAllExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");

        List<String> list = Arrays.asList("Banana", "Cherry", "Apple");

        boolean isChanged = set.addAll(list);
        System.out.println("Set after addAll: " + set);
        System.out.println("Was the set changed? " + isChanged);
    }
}

输出:

Set after addAll: [Apple, Banana, Cherry]
Was the set changed? true

        这样我们就了解了Java中Set中常用的API了!

3.Set的常见实现类

        Java中有几个常见的Set实现类,每个类都有其独特的特性和适用场景。以下是最常见的三种实现:

        (1)HashSet

        ——HashSet是最常用的Set实现类之一。它基于哈希表实现,具有快速的插入、删除和查找操作。由于HashSet不维护元素的顺序,所以其遍历顺序可能与插入顺序不同。

以下为其使用代码:

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<Integer> hashSet = new HashSet<>();
        hashSet.add(1);
        hashSet.add(2);
        hashSet.add(3);

        System.out.println("HashSet: " + hashSet);
    }
}

        (2)LinkedHashSet

        ——LinkedHashSetHashSet的子类,它维护着一个双向链表,以保证元素的插入顺序。因此,遍历LinkedHashSet时,元素将按照其插入顺序返回。

以下为其使用代码:

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetExample {
    public static void main(String[] args) {
        Set<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("One");
        linkedHashSet.add("Two");
        linkedHashSet.add("Three");

        System.out.println("LinkedHashSet: " + linkedHashSet);
    }
}

        (3)TreeSet

        ——TreeSet实现了SortedSet接口,并基于红黑树实现。它保证元素按自然顺序或指定的比较器顺序排序。

以下为其使用代码:

import java.util.Set;
import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        Set<String> treeSet = new TreeSet<>();
        treeSet.add("Banana");
        treeSet.add("Apple");
        treeSet.add("Cherry");

        System.out.println("TreeSet: " + treeSet);
    }
}

        以上就是三种Java中常见的Set类的实现类了!

4.Set的实际案例

        在日常的生活工作中,Java中的Set的用武之地还是有很多的,以下是一些实际使用Set的案例,展示了其在解决具体问题时的应用:

        (1)去除重复元素

        在数据处理中,通常需要去除重复的元素。Set的唯一性特性使其非常适合这个任务。

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class RemoveDuplicates {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana");
        Set<String> set = new HashSet<>(list);
        System.out.println("Unique elements: " + set);
    }
}

        (2)查找集合的交集、并集和差集

        我们还可以使用Set可以方便地进行集合操作,如交集、并集和差集。

import java.util.HashSet;
import java.util.Set;

public class SetOperations {
    public static void main(String[] args) {
        Set<String> set1 = new HashSet<>();
        set1.add("A");
        set1.add("B");
        set1.add("C");

        Set<String> set2 = new HashSet<>();
        set2.add("B");
        set2.add("C");
        set2.add("D");

        // 并集
        Set<String> union = new HashSet<>(set1);
        union.addAll(set2);
        System.out.println("Union: " + union);

        // 交集
        Set<String> intersection = new HashSet<>(set1);
        intersection.retainAll(set2);
        System.out.println("Intersection: " + intersection);

        // 差集
        Set<String> difference = new HashSet<>(set1);
        difference.removeAll(set2);
        System.out.println("Difference: " + difference);
    }
}

        (3)判断两个集合是否相等

        我们可以使用Setequals方法来判断两个集合是否相等。两个集合相等的条件是它们包含的元素相同,顺序无关。

import java.util.HashSet;
import java.util.Set;

public class SetEquality {
    public static void main(String[] args) {
        Set<Integer> set1 = new HashSet<>();
        set1.add(1);
        set1.add(2);
        set1.add(3);

        Set<Integer> set2 = new HashSet<>();
        set2.add(3);
        set2.add(2);
        set2.add(1);

        System.out.println("Are sets equal? " + set1.equals(set2));
    }
}

        当然,Java中的Set还有其他的许多用处,这里作者只是简单的列举出几点,其他的作用读者可以在日常中对其进行探索。这样我们就使用Set的实际案例来帮助你进一步理解Java中的Set类。

5.总结

        在本文中,我们首先全面探讨了Java中的Set接口及其使用方法。Set是Java集合框架的重要组成部分,旨在存储唯一的元素。其主要特点包括元素的唯一性和无序性,使其在需要去重或处理集合操作时非常有用。

        接着我们详细介绍了Set接口中的常用API,如addclearcontainsiteratorremovesizeisEmptytoArraycontainsAlladdAll,并通过代码示例演示了这些方法的实际应用。        

        之后我们还讨论了HashSetLinkedHashSetTreeSet这几种常见的Set实现类,分析了它们的特点和适用场景。

        最后通过实际案例,我们展示了如何利用Set解决实际编程问题,如去除重复元素、进行集合操作和判断集合相等。通过对Set的深入理解和实际应用,我们能够在开发中更高效地处理集合数据,提升代码的性能和可维护性。


以上就是本篇文章的全部内容了~~~

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

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

相关文章

vue-router基本流程及其案例分析

web发展历程 1.后端实现路由 在这个阶段&#xff0c;前端基本上只写界面&#xff0c;也就是html,css,js那些东西&#xff0c;然后在界面中挖槽用来接后端数据&#xff0c;包括路由也由后端负责&#xff0c;在这个阶段中&#xff0c;web开发非常依赖后端&#xff0c;常见的后端…

系列精选 |【梧桐数据库】产品架构层次解析-总述

梧桐数据库中秋特别活动免费领取大闸蟹 抽奖免费领取大闸蟹 以下是正文 在浩瀚的数据世界里&#xff0c;梧桐数据库犹如一颗璀璨的星辰&#xff0c;它的设计如同一首细腻的诗歌&#xff0c;每一个层次都是优美的韵律&#xff0c;为我们构建了一个强大而灵动的数据天地。 梧桐数…

西中区2024年度安全知识竞赛活动方案

为有效预防安全生产事故的发生&#xff0c;深化西中区全体员工对安全生产的认识&#xff0c;切实提升全体人员的安全意识和自我保护能力&#xff0c;夯实安全知识基础&#xff0c;丰富安全文化内涵&#xff0c;推动安全生产工作更加规范化、系统化&#xff0c;根据西中区安全生…

<数据集>遥感航拍飞机和船舶和识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;19973张 标注数量(xml文件个数)&#xff1a;19973 标注数量(txt文件个数)&#xff1a;19973 标注类别数&#xff1a;2 标注类别名称&#xff1a;[ship,plane] 序号类别名称图片数框数1ship17575416292plane239815…

简单好用的SD卡克隆软件:轻松克隆SD卡

想更换SD卡以提升性能&#xff0c;但不知道如何进行SD卡克隆&#xff1f;不用担心&#xff0c;本文推荐了一款好用SD卡克隆软件&#xff0c;轻松帮你解决问题&#xff01; 为什么要克隆SD卡&#xff1f; SD卡广泛应用于游戏机、手机及其他便携设备。用户常用SD卡存储个人数据…

2024/9/3黑马头条跟学笔记(一)

D1 视频链接 Day1-05-nacos环境搭建_哔哩哔哩_bilibili 内容介绍 搭建微服务开发环境&#xff0c;登录接口包含注册中心和nacos配置中心 服务端用户…微服务。网关负载均衡转发接口请求 实现微服务间互相通信 接口测试 前后端联调 前置知识 背景介绍 类似今日头条&#x…

权威解读:社交类APP都需要办理哪些资质?

今天小编给大家讲讲社交类APP都需要办理哪些资质&#xff1f; 我们先来看下微信小程序对社交类目是怎么分类以及需要哪些资质许可证&#xff1f; 微信小程序社交类目许可资质 微信小程序对社交类目做了一些细分&#xff0c;它把社交分为陌生人交友、熟人交友、社区/论坛、直播…

log4j 控制台和文件输出乱码问题解决

一个小问题&#xff0c;却让我感觉到&#xff0c;现在真正动脑的人很少。。我来说说吧。 今天遇到一个小问题&#xff0c; log4j输出到文件乱码&#xff0c;控制台正常。显然是编码问题导致。Google一搜&#xff0c;几乎一水的说&#xff1a; 项目中log4j在英文版linux下输出中…

气膜水产养殖:打造高效、可持续的水产养殖新模式—轻空间

随着全球对高质量水产品需求的不断增加&#xff0c;传统的水产养殖方式面临着诸多挑战&#xff0c;如环境污染、气候变化以及水源短缺等问题。在这种背景下&#xff0c;气膜水产养殖作为一种创新的养殖模式&#xff0c;逐渐引起了广泛关注。通过结合气膜结构建筑与现代化养殖技…

【测试】系统测试用例编写案例模板(Word原件)

1编写目的 2使用范围 3文档概述 4术语和缩略语 5编写规范 5.1编写目的 5.2编写范围 5.3编写规范 6参考文档 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需…

从UGC到PGC:3C品牌与TikTok达人合作的内容优化策略

在数字营销新时代&#xff0c;内容的创作和传播方式正在经历快速的变革。3C品牌与TikTok达人的合作正逐渐从用户生成内容&#xff08;UGC&#xff09;向专业生成内容&#xff08;PGC&#xff09;转变。这一转变不仅改变了内容的生产方式&#xff0c;也提升了品牌营销的效果。本…

三种权限模型该如何选择

在构建企业级平台或复杂应用系统时&#xff0c;权限管理是一个至关重要的环节。它决定了哪些用户可以访问哪些资源&#xff0c;以及可以进行哪些操作&#xff0c;一个健全的权限管理架构&#xff0c;在确保系统正常运行的同时&#xff0c;也能有效防止数据泄露和非法访问&#…

antd:手写走马灯vue组件

在使用ant-design-vue做走马灯的时候,封装的组件的自由度太低,难以实现想要的效果,于是本人自己写了一个走马灯组件,以方便代码复用。本文将介绍如何在vue框架中,使用ant-design-vue手动实现走马灯组件效果。 结果如下图所示, 一、使用说明 使用时,直接创建一个组件,…

.NET 最好用的验证组件 FluentValidation

目录 前言 项目介绍 项目使用 1、安装FluentValidation 2、Program.cs 3、Startup.cs 4、版本兼容 5、支持的验证器 6、可扩展 7、Swagger 模型和验证器 8、包含验证器 高级用法 1、异步验证 2、条件验证 3、自定义验证规则 4、自定义错误消息 项目地址 总结 …

comfyui替换电商模特工作流,模特们要真的要失业了吗?

前言 comfyui生态的丰富绝对是电商行业的福利&#xff0c;有助于电商老板们开源节流&#xff0c;废话不多说本着追求进步进一步理解comfyui工作流的搭建逻辑&#xff0c;我们来拆解电商模特替换这个工作流&#xff01; 老规矩一句话说工作流原理&#xff0c;1.借助XL-tile修改…

Funsound: 快速为你的视频加上字幕

Funsound是基于阿里达摩院funasr开发的中文语音识别工具&#xff0c;其paraformer非自回归解码速度超快&#xff0c;同时预训练模型识别精度业界领先。本文将简要介绍funsound下如何快速为你的视频添加字幕&#xff0c;十分简单方便。 1. 上传音视频识别 & 导出SRT 打开fu…

无人机之飞行速度篇

无人机的飞行速度是一个复杂且多变的参数&#xff0c;它受到多种因素的影响。以下是对无人机飞行速度及其影响因素的详细分析&#xff1a; 一、无人机飞行速度概述 无人机的飞行速度通常以其在不同飞行模式下的水平飞行速度来衡量&#xff0c;如平稳挡&#xff08;Cine&#x…

关于武汉高芯coin417G2红外机芯的二次开发

文章目录 前言一、外观和机芯参数二、SDK的使用1、打开相机2、回调函数中获取全局温度和图像3、关闭相机 前言 最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该…

踩坑记录(序列化与反序列化)

问题描述 实体类中设定字段名称为 sValue和yValue 返回给前段后,变成了svalue,yvalue 字段设置 测试结果:与字段不符,匹配失败 解决方法 在字段上添加JsonProperty("字段名")注解

乌班图部署若依(nginx)

Nginx 什么是Nginx Nginx&#xff08;发音为"engine x"&#xff09;是由俄罗斯开发者Igor Sysoev创建的一款轻量级、高性能的Web服务器。它首次发布于2004年&#xff0c;如今已成为全球最受欢迎的Web服务器之一。Nginx以其卓越的性能和灵活性而闻名&#xff0c;适用…