陣列與字串是 Java 最基礎也最高頻的資料結構。本文系統整理陣列宣告/初始化/遍歷/填充/排序/複製/查找/合併/反轉/移除,以及字串拼接/長度/索引/字元存取/去空白/替換/比較/大小寫/分割/格式化/三大類別對比,附代碼範例與效能建議。
int[] arr1 = new int[]{1, 3, 5, 7, 9}; // 顯式 new
int[] arr2 = {2, 4, 6, 8, 10}; // 簡寫 (僅限宣告時)
int[][] matrix = new int[3][4]; // 多維陣列
// 索引 for (效能最好、可修改元素)
for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); }
// 增強 for / for-each (唯讀、語法簡潔)
for (int x : arr) { System.out.print(x + " "); }
// Stream API (函數式、鏈式操作)
Arrays.stream(arr).forEach(System.out::print);
fill(arr, val) | 全部填充 | Arrays.fill(arr, 10); |
| fill(arr, from, to, val) | 區間填充 | Arrays.fill(arr, 1, 3, 8); |
| sort(arr) | 自然順序排序 (Dual-Pivot QuickSort) | Arrays.sort(arr); |
| sort(arr, from, to) | 區間排序 | Arrays.sort(arr, 1, 4); |
| copyOf(arr, newLen) | 複製並調整長度 | int[] copy = Arrays.copyOf(arr, 10); |
| copyOfRange(arr, from, to) | 複製區間 | int[] sub = Arrays.copyOfRange(arr, 1, 3); |
| binarySearch(arr, key) | 二分查找 (前提已排序) | int idx = Arrays.binarySearch(arr, 5); |
| equals(arr1, arr2) | 內容比較 | Arrays.equals(arr1, arr2) |
| toString(arr) | 除錯輸出 | System.out.println(Arrays.toString(arr)); |
| stream(arr) | 轉 Stream | Arrays.stream(arr).filter(x > 3).toArray(); |
import org.apache.commons.lang3.ArrayUtils;
// 合併兩陣列
int[] combined = ArrayUtils.addAll(arr1, arr2); // [1,3,5,7,9,2,4,6,8,10]
// 反轉 (原地修改)
ArrayUtils.reverse(arr); // [9,7,5,3,1]
// 移除元素 (回傳新陣列)
int[] removed = ArrayUtils.removeElement(arr, 3); // 移除值為 3 的第一個
// 判斷包含某值
boolean contains = ArrayUtils.contains(arr, 5); // true
String[] strArr = {"a", "b", "c"};
boolean hasA = Arrays.asList(strArr).contains("a"); // true (裝箱開銷較大)
boolean hasA2 = Arrays.stream(strArr).anyMatch("a"::equals); // 推薦 Stream
String s1 = "Hello";
String s2 = new String("World"); // 不推薦 new String("常量")
String s3 = s1 + " " + s2; // 編譯器優化為 StringBuilder
String s4 = String.join(",", "a", "b", "c"); // "a,b,c" (Java 8+)
String str = "Hello Java";
int len = str.length(); // 10
int idx = str.indexOf("o"); // 1 (首次)
int last = str.lastIndexOf("o"); // 9 (末次)
char c = str.charAt(4); // 'o'
String s = " Hello Java ";
s.trim(); // "Hello Java" (僅首尾)
s.strip(); // Java 11+ Unicode 感知
s.replaceAll("\\s+", ""); // "HelloJava" (全域含中間)
String src = "abc abd bcd";
src.replace("ab", "xx"); // "xxc xxd bcd" (全域替換, 非 regex)
src.replaceFirst("ab", "xx"); // "xxc abd bcd" (首次替換, regex)
src.replaceAll("a.", "XX"); // "XXc XXd bcd" (regex 全域)
String a = "Summer";
String b = new String("Summer");
String c = a;
a == b; // false (比較參考)
a == c; // true (同一物件)
a.equals(b); // true (內容比較)
a.equalsIgnoreCase("summer"); // true (忽略大小寫)
"summer".startsWith("sum"); // true
"summer".endsWith("mer"); // true
String s = "hello WORLD";
s.toLowerCase(); // "hello world"
s.toUpperCase(); // "HELLO WORLD"
// 區域敏感: s.toLowerCase(Locale.TRADITIONAL_CHINESE)
"abc,def,g,h".split(","); // ["abc","def","g","h"]
"a b c".split("\\s+"); // ["a","b","c"] (regex 多空白)
"abc".split(""); // ["a","b","c"] (Java 8+ 無空字串)
// String.format (靜態工廠)
String.format("Hi %s, %.2f", "Tom", 3.14159); // "Hi Tom, 3.14"
// 日期格式化 (Java 8+ java.time)
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
// 數值格式化
NumberFormat.getCurrencyInstance(Locale.US).format(1234.5); // "$1,234.50"
String | StringBuffer | StringBuilder |
|------|---------------------|---------------------------|----------------------------|
| 可變性 | **不可變** (每次修改產生新物件) | **可變** | **可變** |
| 執行緒安全 | 不適用 | **同步 (慢)** | **非同步 (快)** |
| 效能 | 低 (頻繁修改產生大量垃圾) | 中 | **高 (單執行緒首選)** |
| 適用場景 | 常量、鍵值、少量拼接 | 多執行緒共享緩衝區 | **單執行緒大量拼接、JSON 構建、SQL 拼裝** |
// 效能測試: 10萬次拼接
String s = "";
for (int i = 0; i < 100_000; i++) s += "a"; // 極慢, O(n²) 產生大量臨時物件
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100_000; i++) sb.append("a"); // 極快, 線性擴容
StringBuffer sbf = new StringBuffer();
for (int i = 0; i < 100_000; i++) sbf.append("a"); // 比 Builder 慢 ~10-20% (鎖開銷)
ArrayList / List。== 僅比較參考,常量池情況不可靠。split(".") 錯誤 → split("\\.");replaceAll("$", "x") 錯誤 → replaceAll("\\$", "x")。StringJoiner sj = new StringJoiner(",", "[", "]"); 可直接生成 [a,b,c] 格式。Arrays.asList(1,2,3) 回傳固定長度 List,不可增刪;new ArrayList<>(Arrays.asList(...)) 才可變。陣列提供**記憶體緊湊、隨機存取 O(1)** 的基礎容器;字串作為**不可變字元序列**保證執行緒安全與常量池複用。掌握 Arrays/ArrayUtils、StringBuilder、String.format/DateTimeFormatter 三大工具組合,即能高效、優雅地處理 90% 以上的資料轉換與展示需求。