Java - Set 介面

歡迎,未來的 Java 程式設計師們!今天,我們將踏上一段令人興奮的旅程,進入 Java 的 Set 介面世界。作為你們親切鄰居的計算機科學老師,我會指導你們完成這次冒險,一步步來。所以,拿起你們的虛擬背包,我們一起跳進去吧!

Java - Set Interface

什麼是 Set?

在我們深入了解 Java 的細節之前,讓我們先了解在真實世界中 Set 是什麼。想像你有一盒彈珠。在這個盒子里,你不希望有任何重複的彈珠。每個彈珠都應該是唯一的。這基本上就是編程中的 Set —— 一個由唯一元素組成的集合。

Java Set 介面基礎

在 Java 中,Set 介面是 Java 集合框架的一部分。它繼承自 Collection 介面,並代表一個不能包含重複元素的集合。把它想像成我們裝滿了唯一彈珠的盒子!

Set 的關鍵特徵

  1. 沒有重複元素
  2. 至多只能有一個 null 元素(對於大多數實現來說)
  3. 元素沒有保證的順序(除非你使用像 LinkedHashSet 這樣的特定實現)

Java 中的 Set 實現

Java 提供了 Set 介面的多種實現。讓我們看看最常見的三種:

  1. HashSet
  2. TreeSet
  3. LinkedHashSet

每種都有其自己的特性和使用場景。讓我們一一探索。

HashSet

HashSet 就像一個袋子,你可以把你的唯一物品丟進去。它很快,但不會保持任何順序。

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
public static void main(String[] args) {
Set<String> fruits = new HashSet<>();

fruits.add("Apple");
fruits.add("Banana");
fruits.add("Orange");
fruits.add("Apple");  // 這個不會被加入,因為它是重複的

System.out.println(fruits);
}
}

輸出:

[Apple, Orange, Banana]

在這個例子中,我們創建了一個水果的 HashSet。注意第二個 "Apple" 沒有被加入,且元素的順序不保證。

TreeSet

TreeSet 就像將你的唯一物品按照字母或數字順序組織起來。它比 HashSet 慢,但能保持排序順序。

import java.util.Set;
import java.util.TreeSet;

public class TreeSetExample {
public static void main(String[] args) {
Set<Integer> numbers = new TreeSet<>();

numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);

System.out.println(numbers);
}
}

輸出:

[1, 2, 5, 8]

看見數字自動排序了嗎?這就是 TreeSet 的魔法!

LinkedHashSet

LinkedHashSet 是 HashSet 和 LinkedList 的混合體。它在確保唯一性的同時,還能保持元素插入的順序。

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetExample {
public static void main(String[] args) {
Set<String> colors = new LinkedHashSet<>();

colors.add("Red");
colors.add("Green");
colors.add("Blue");
colors.add("Red");  // 這個不會被加入,因為它是重複的

System.out.println(colors);
}
}

輸出:

[Red, Green, Blue]

注意插入的順序被保持了,但重複的元素仍然不允許。

常見的 Set 運算

現在我們已經了解了基礎知識,讓我們看看我們可以用 Sets 進行的一些常見操作。

加入元素

我們已經看到了如何使用 add() 方法加入元素。這裡快速複習一下:

Set<String> set = new HashSet<>();
set.add("元素");

移除元素

要移除元素,我們使用 remove() 方法:

set.remove("元素");

檢查元素是否存在

我們可以使用 contains() 方法來檢查元素是否在 Set 中:

boolean exists = set.contains("元素");

獲取 Set 的尺寸

要獲取 Set 中元素的數量,我們使用 size() 方法:

int size = set.size();

清空 Set

要從 Set 中移除所有元素,我們使用 clear() 方法:

set.clear();

Set 介面方法

這裡是一個最常用的 Set 介面方法表格:

方法 描述
add(E e) 如果指定的元素尚未存在,則將其添加到集合中
clear() 從集合中移除所有元素
contains(Object o) 如果集合包含指定的元素,則返回 true
isEmpty() 如果集合不包含任何元素,則返回 true
remove(Object o) 如果存在,從集合中移除指定的元素
size() 返回集合中的元素數量
toArray() 返回包含集合中所有元素的數組

實際世界範例:唯一訪客計數器

讓我們將我們的知識應用於一個實際世界的範例。想像你正在為一個網站建立一個簡單的訪客計數器,但你只想計算唯一訪客。

import java.util.HashSet;
import java.util.Set;

public class UniqueVisitorCounter {
private Set<String> visitors;

public UniqueVisitorCounter() {
visitors = new HashSet<>();
}

public void addVisitor(String visitorId) {
visitors.add(visitorId);
}

public int getUniqueVisitorCount() {
return visitors.size();
}

public static void main(String[] args) {
UniqueVisitorCounter counter = new UniqueVisitorCounter();

counter.addVisitor("user1");
counter.addVisitor("user2");
counter.addVisitor("user1");  // 重複,不會被計數
counter.addVisitor("user3");

System.out.println("唯一訪客: " + counter.getUniqueVisitorCount());
}
}

輸出:

唯一訪客: 3

在這個例子中,我們使用 HashSet 來存儲訪客 ID。即使訪客多次訪問(如 "user1"),他們也只會被計數一次。這就是 Sets 的力量!

結論

恭喜你!你已經踏出了進入 Java Set 介面世界的第一步。我們介紹了基礎知識,探索了不同的實現,甚至建立了一個實際應用的範例。記住,熟練需要練習,所以不要猶豫去實驗這些概念。

在我們結束之前,這裡有一個編程幽默給你:Java 開發者為什麼戴眼鏡?因為他們不用 C#!(明白嗎?C-Sharp?好吧,我會自己出去...)

持續編程,持續學習,最重要的是,繼續在 Java 中找到樂趣!

Credits: Image by storyset