在 Java 開發中,資料存儲與操作是核心需求。JDK 在 java.util 包中提供了一組專門用於存儲對象的類與介面,統稱為集合框架。這些容器類透過大量介面設計,統一了各類集合的使用方式,極大提升了開發效率。
集合框架提供兩種基本存儲模式:
List 實現,不可重複由 Set 實現。底層資料結構(陣列、鏈表、樹、哈希表等)決定了各實現類的性能特徵:陣列查詢快,鏈表增刪靈活,樹結構有序,哈希表查找極快。此外,存入集合的對象建議覆寫 equals() 與 hashCode() 以提升效率。
List 介面實現類以索引操作元素,允許重複。常見實現:
| 方法 | 說明 |
|---|---|
add(E e) | 尾部追加元素 |
add(int index, E element) | 指定位置插入,後續元素後移 |
get(int index) | 獲取指定索引元素 |
set(int index, E element) | 替換指定索引元素 |
remove(int index) / remove(Object o) | 按索引或內容刪除,自動填補空位 |
indexOf / lastIndexOf | 正向/反向查找首次出現位置 |
size() | 返回有效元素個數 |
toArray() | 轉換為 Object 陣列 |
import java.util.*;
public class ListDemo {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("1"); list.add("2"); list.add("3");
list.add("1"); list.add("1"); // 允許重複
list.add(1, "12"); // 索引 1 插入
list.set(2, "a"); // 修改索引 2
list.remove("1"); // 刪除首個 "1"
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 輸出:12, a, 3, 1, 1
}
}
Set 介面強制元素唯一,適合去重、成員資格測試等場景。主要實現:
Set 無 get(index),遍歷需用 Iterator 或增強 for 循環。不支援插入、修改操作。
import java.util.*;
public class SetDemo {
public static void main(String[] args) {
Set set = new HashSet<>();
set.add("1"); set.add("2"); set.add("3");
set.add("1"); set.add("1"); // 重複元素被忽略
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 輸出順序不固定,如:3, 2, 1
}
}
Map 以 Key-Value 存儲,Key 唯一,Value 可重複。常見實現:
| 方法 | 說明 |
|---|---|
put(K key, V value) | 存入鍵值對,Key 存在則覆蓋舊值 |
get(Object key) | 根據 Key 獲取 Value |
remove(Object key) | 刪除指定 Key 的映射 |
keySet() | 返回所有 Key 組成的 Set |
values() | 返回所有 Value 組成的 Collection |
size() | 映射對數量 |
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put("蘋果", "2.5");
map.put("桔子", "2.5");
map.put("香蕉", "3");
map.put("菠蘿", "2");
map.remove("桔子"); // 刪除
map.put("菠蘿", "5"); // 修改值
System.out.println("個數:" + map.size());
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
// 輸出:個數:3, 香蕉:3, 菠蘿:5, 蘋果:2.5
}
}
利用 Vector(List 實現)存儲拆分後的運算元與運算符,按優先級計算四則運算(不含括號)。
import java.util.*;
public class CalcStr {
public static void main(String[] args) {
System.out.println(calc("1+20*3/5")); // 13.0
}
public static double calc(String s) {
Vector v = split(s);
return calcVector(v);
}
private static Vector split(String s) {
Vector v = new Vector<>();
StringBuilder num = new StringBuilder();
for (char c : s.toCharArray()) {
if ("+-*/".indexOf(c) >= 0) {
v.add(num.toString());
v.add(String.valueOf(c));
num.setLength(0);
} else {
num.append(c);
}
}
v.add(num.toString());
return v;
}
private static double calcVector(Vector v) {
// 先算乘除
while (true) {
int idxMul = v.indexOf("*");
int idxDiv = v.indexOf("/");
if (idxMul == -1 && idxDiv == -1) break;
int idx = (idxMul != -1 && (idxDiv == -1 || idxMul < idxDiv)) ? idxMul : idxDiv;
String op = v.get(idx);
double a = Double.parseDouble(v.get(idx - 1));
double b = Double.parseDouble(v.get(idx + 1));
double res = op.equals("*") ? a * b : a / b;
v.remove(idx - 1); v.remove(idx - 1); v.remove(idx - 1);
v.insertElementAt(String.valueOf(res), idx - 1);
}
// 再算加減
while (true) {
int idxAdd = v.indexOf("+");
int idxSub = v.indexOf("-");
if (idxAdd == -1 && idxSub == -1) break;
int idx = (idxAdd != -1 && (idxSub == -1 || idxAdd < idxSub)) ? idxAdd : idxSub;
String op = v.get(idx);
double a = Double.parseDouble(v.get(idx - 1));
double b = Double.parseDouble(v.get(idx + 1));
double res = op.equals("+") ? a + b : a - b;
v.remove(idx - 1); v.remove(idx - 1); v.remove(idx - 1);
v.insertElementAt(String.valueOf(res), idx - 1);
}
return Double.parseDouble(v.get(0));
}
}