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操作

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不保证遍历顺序)

Fruits: [Banana, Orange, Apple]
Was 'Apple' added again? false
Banana
Orange
Apple

5. 🧠 小总结

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

📌 小贴士

  • 可以举生活例子

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

  • 提个问题引导互动

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

(正确答案是:LinkedHashSet

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容