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)