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

相关推荐
|晴 天|5 小时前
Vue 3 + TypeScript + Element Plus 博客系统开发总结与思考
前端·vue.js·typescript
猫3286 小时前
v-cloak
前端·javascript·vue.js
旷世奇才李先生6 小时前
Vue 3\+Vite\+Pinia实战:企业级前端项目架构设计
前端·javascript·vue.js
GetcharZp6 小时前
比 Zap 还要快?Go 社区高性能日志神器 Zerolog 落地实践指南
后端
anzhxu7 小时前
Go基础之环境搭建
开发语言·后端·golang
刀法如飞7 小时前
一款Python语言Django框架DDD脚手架,适合中大型项目
后端·python·领域驱动设计
zb200641207 小时前
SpringBoot详解
java·spring boot·后端
SoaringHeart7 小时前
Flutter进阶:用OverlayEntry 实现所有弹窗效果
前端·flutter
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题】【Java基础篇】第7题:HashMap的get流程是什么
java·后端·面试·哈希算法·散列表·hash-index·hash
霸道流氓气质9 小时前
SpringBoot+LangChain4j+Ollama+RAG(检索增强生成)实现私有文档向量化检索回答
java·spring boot·后端