Java - 數據結構

歡迎,未來的程序员們!今天,我們將進入Java數據結構的精彩世界。作為你們親切鄰居的計算機科學老師,我在這裡指引你們開展這次旅程,一步一步地。如果你是編程新手,不必擔心——我們會從基礎開始,逐步提升。那麼,戴上你們的虛擬安全帽,讓我們開始建立知識吧!

Java - Data Structures

數據結構介紹

在我們深入特定的Java數據結構之前,讓我們先了解什麼是數據結構,以及它們為什麼重要。

想像你正在組織一個圖書館。你會把所有的書隨意堆積在一起嗎?當然不會!你會以一種方便找到和管理它們的方式來組織它們。這正是數據結構在我們編程中的數據所做的。

數據結構是組織和存儲數據的方式,讓我們能夠高效地訪問和修改它。在Java中,我們有幾種內置的數據結構可以使用,每種都有其自身的優勢和使用場景。

Java內置數據結構

讓我們探索一些Java中最常見的數據結構:

枚舉(Enumeration)

枚舉就像一個售票機,一次發出一個號碼。它是Java中的一個接口,讓我們能夠一次訪問集合中的一個元素。

以下是一個簡單的例子:

import java.util.*;

public class 枚舉範例 {
public static void main(String args[]) {
Vector<String> dayNames = new Vector<>();
dayNames.add("Monday");
dayNames.add("Tuesday");
dayNames.add("Wednesday");

Enumeration<String> days = dayNames.elements();

while (days.hasMoreElements()) {
System.out.println(days.nextElement());
}
}
}

在這個例子中,我們創建了一個包含日名的Vector,並使用枚舉來遍歷它們。hasMoreElements()方法檢查是否有更多元素,而nextElement()方法則检索下一個元素。

位集合(BitSet)

位集合就像一排開關——每個開關可以是開(1)或關(0)。當你需要高效地存儲一系列的true/false值時,它非常有用。

以下是一個例子:

import java.util.BitSet;

public class 位集合範例 {
public static void main(String args[]) {
BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16);

// 設置一些位
for(int i = 0; i < 16; i++) {
if((i % 2) == 0) bits1.set(i);
if((i % 5) != 0) bits2.set(i);
}

System.out.println("bits1的初始模式: " + bits1);
System.out.println("bits2的初始模式: " + bits2);

// 位與操作
bits2.and(bits1);
System.out.println("bits2 AND bits1: " + bits2);
}
}

這個例子演示了創建位集合、設置位和執行位運算。

向量(Vector)

向量就像一個可以隨時增長或縮小的神奇數組。它與ArrayList相似,但是同步的,使其线程安全。

以下是如何使用向量的例子:

import java.util.*;

public class 向量範例 {
public static void main(String args[]) {
Vector<Integer> vec = new Vector<>(3, 2);
System.out.println("初始大小: " + vec.size());
System.out.println("初始容量: " + vec.capacity());

vec.addElement(1);
vec.addElement(2);
vec.addElement(3);
vec.addElement(4);
System.out.println("四次添加後的容量: " + vec.capacity());

vec.addElement(5);
System.out.println("當前容量: " + vec.capacity());

System.out.println("第一個元素: " + vec.firstElement());
System.out.println("最後一個元素: " + vec.lastElement());
}
}

這個例子展示了如何創建向量、添加元素以及檢查其大小和容量。

栈(Stack)

栈就像一疊盤子——你只能從頂部添加或移除。它遵循後進先出(LIFO)的原則。

讓我們看看栈是如何工作的:

import java.util.*;

public class 栈範例 {
public static void main(String args[]) {
Stack<String> stack = new Stack<>();
stack.push("Bottom");
stack.push("Middle");
stack.push("Top");

System.out.println("栈: " + stack);
System.out.println("彈出: " + stack.pop());
System.out.println("彈出後的栈: " + stack);
System.out.println("頂部查看: " + stack.peek());
System.out.println("查看後的栈: " + stack);
}
}

這個例子演示了將元素推入栈、彈出元素以及查看栈頂元素。

字典(Dictionary)

字典是一個表示鍵值數據結構的抽象類。它就像一個真正的字典,每個單詞(鍵)都有一個定義(值)。

雖然字典是抽象的,不能直接實例化,但其子類Hashtable通常被廣泛使用:

import java.util.*;

public class 字典範例 {
public static void main(String args[]) {
Dictionary<String, String> dict = new Hashtable<>();

dict.put("Apple", "一種水果");
dict.put("Java", "一種編程語言");
dict.put("Computer", "一種電子設備");

System.out.println("字典: " + dict);
System.out.println("鍵 'Java' 的值: " + dict.get("Java"));

System.out.println("鍵: ");
for (Enumeration<String> keys = dict.keys(); keys.hasMoreElements();) {
System.out.println(keys.nextElement());
}
}
}

這個例子展示了如何使用字典(通過Hashtable)來存儲和检索鍵值對。

數組表(Hashtable)

Hashtable就像一個超高效的文件櫃。它存儲鍵值對,並允許基於鍵快速检索值。

以下是如何使用Hashtable的例子:

import java.util.*;

public class 數組表範例 {
public static void main(String args[]) {
Hashtable<String, Integer> numbers = new Hashtable<>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);

System.out.println("散列表: " + numbers);
System.out.println("'two' 的值: " + numbers.get("two"));
System.out.println("'four' 是一個鍵嗎? " + numbers.containsKey("four"));
System.out.println("3 是一個值嗎? " + numbers.containsValue(3));

numbers.remove("two");
System.out.println("移除 'two' 後的散列表: " + numbers);
}
}

這個例子演示了向散列表中添加鍵值對、检索值、檢查鍵和值以及移除條目。

属性(Properties)

屬性是一種特殊的Hashtable,設計用於存儲字符串鍵值對。它通常用於配置設置。

讓我們看看屬性是如何工作的:

import java.util.*;

public class 屬性範例 {
public static void main(String args[]) {
Properties capitals = new Properties();
capitals.put("USA", "Washington D.C.");
capitals.put("France", "Paris");
capitals.put("Japan", "Tokyo");

System.out.println("屬性: " + capitals);
System.out.println("法國的首都: " + capitals.getProperty("France"));

// 設置一個默認值
System.out.println("西班牙的首都: " + capitals.getProperty("Spain", "未找到"));

capitals.list(System.out);
}
}

這個例子展示了如何使用屬性來存儲和检索字符串鍵值對,以及為缺失的鍵設置默認值。

結論

恭喜你!你已經邁出了進入Java數據結構世界的第一步。每種結構都有其獨特的屬性和使用場景。在你繼續編程旅程的過程中,你會發現自己根據特定的需求選擇不同的結構。

記住,選擇正確的數據結構可以大大影響你的程序運行的效率。這就像選擇正確的工具來完成工作一樣——鐵錘對釘子來說非常好,但對螺釘就不那麼適合了!

繼續練習這些結構,嘗試在自製專案中使用它們,並不怕嘗試。祝你編程愉快!

Credits: Image by storyset