226. Java 集合 - Set接口 —— 拒绝重复元素的集合

226. Java 集合 - Set接口 ------ 拒绝重复元素的集合


1. 🔹 Set和普通Collection有什么区别?

在Java集合框架中,**Set**也是**Collection**的一个子接口。 最大的特点是: ✅ Set不能包含重复元素!

📌 具体区别总结

  • 在普通Collection(如List)中,可以有重复元素
  • Set中,元素必须唯一 ------ 不能出现两个"相等"的对象。

小知识:这里的"相等"是通过对象的equals()方法判断的,不是通过==比较引用哦!


2. 🚀 为什么Set中不能有重复?

在添加元素到Set时,Set会检查新元素是否已经存在

  • 如果已存在,则添加失败Set大小不变。
  • 如果不存在,才会添加进去。

📢 注意:

  • 添加元素可能失败 ,这是Set独有的特性。
  • 具体如何检测重复 ,取决于Set的具体实现,例如HashSet使用哈希值,TreeSet使用元素的排序规则。

3. 🎯 Set有没有索引?

List中,每个元素都有索引 (比如第0个元素、第1个元素),可以按位置访问。 而在Set中:

  • 没有索引
  • ❌ 你不能用set.get(0)这样的方式取元素。

虽然有些特殊的Set实现,比如LinkedHashSet,遍历时的顺序是固定的(按插入顺序), 但这不代表你可以按位置操作它,Set就是不提供索引访问的方法。


4. 🛠️ 示例:基本Set操作

java 复制代码
import java.util.*;

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

        // 添加元素
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");

        // 尝试添加重复元素
        boolean added = fruits.add("Apple"); // 返回false

        System.out.println("Fruits: " + fruits);
        System.out.println("Was 'Apple' added again? " + added);

        // 遍历Set
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

运行输出(注意:HashSet不保证遍历顺序)

java 复制代码
Fruits: [Banana, Orange, Apple]
Was 'Apple' added again? false
Banana
Orange
Apple

5. 🧠 小总结

特性 Collection Set
是否允许重复元素? 允许 不允许
是否保证元素顺序? 不保证 部分实现保证(如LinkedHashSet),但无索引
是否有索引?
添加元素是否可能失败? 不常见 可能,因为避免重复

📌 小贴士

  • 可以举生活例子

    "Collection就像一个普通抽屉,什么东西都能塞,重复也无所谓;而Set像是一个只收集独一无二邮票的册子,不能有重复!"

  • 提个问题引导互动

    "如果我希望一个集合里不允许出现相同元素,但我又希望能按顺序遍历它,应该选择哪种Set实现呢?"

(正确答案是:LinkedHashSet

相关推荐
EndingCoder2 小时前
类的继承和多态
linux·运维·前端·javascript·ubuntu·typescript
用户47949283569152 小时前
React 终于出手了:彻底终结 useEffect 的"闭包陷阱"
前端·javascript·react.js
程序员猫哥2 小时前
前端开发,一句话生成网站
前端
咕白m6252 小时前
通过 C# 快速生成二维码 (QR code)
后端·.net
踏浪无痕2 小时前
架构师如何学习 AI:三个月掌握核心能力的务实路径
人工智能·后端·程序员
Younglina2 小时前
一个纯前端的网站集合管理工具
前端·vue.js·chrome
木头程序员2 小时前
前端(包含HTML/JavaScript/DOM/BOM/jQuery)基础-暴力复习篇
开发语言·前端·javascript·ecmascript·es6·jquery·html5
卖火箭的小男孩2 小时前
# Flutter Provider 状态管理完全指南
前端
小雨青年2 小时前
鸿蒙 HarmonyOS 6|ArkUI(01):从框架认知到项目骨架
前端
小毅&Nora2 小时前
【后端】【SpringBoot】① 源码解析:从启动到优雅关闭
spring boot·后端·优雅关闭