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

相关推荐
代码扳手4 小时前
Go 开发的“热更新”真相:从 fresh 到真正的零停机思考
后端·go
前端小咸鱼一条4 小时前
13. React中为什么使用setState
前端·javascript·react.js
9号达人4 小时前
认证方案的设计与思考
java·后端·面试
BingoGo4 小时前
PHP 组件未来:Livewire 4 正式发布,性能更快,功能更完整
后端·php
William_cl4 小时前
拆解ASP.NET MVC 视图模型:为 View 量身定制的 “数据小票“
后端·asp.net·mvc
辜月十4 小时前
设置 Root 账号 并能够 SSH进行链接
后端
QZQ541884 小时前
当数据多到放不下内存时,算子的外部执行机制
后端
没有bug.的程序员4 小时前
Spring Boot 常见性能与配置优化
java·spring boot·后端·spring·动态代理
没有bug.的程序员4 小时前
Spring Boot Actuator 监控机制解析
java·前端·spring boot·spring·源码