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

相关推荐
xiaofeichaichai40 分钟前
Webpack
前端·webpack·node.js
GetcharZp1 小时前
GitHub 49K+ Star!C++ 开发者必知的 JSON 神级库:从零到精通全指北
后端
问心无愧05131 小时前
ctf show web入门111
android·前端·笔记
xujinwei_gingko1 小时前
SpringBoot整合WebSocket
spring boot·后端·websocket
唐某人丶1 小时前
模型越来越强,我们还需要 Agent 工程吗?—— 从价值重估到 Harness 实践
前端·agent·ai编程
智码看视界1 小时前
现代Web开发基础:全栈工程师的起航点
前端·后端·c5全栈
程序员cxuan1 小时前
Claude Fable 5 来了
人工智能·后端·程序员
JS菌2 小时前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
wang09072 小时前
自己动手写一个spring之IOC_2
java·后端·spring