首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 陣列與字串核心操作大全:宣告、遍歷、排序、複製、格式化實戰

     編輯:Java 相關知識

陣列與字串是 Java 最基礎也最高頻的資料結構。本文系統整理陣列宣告/初始化/遍歷/填充/排序/複製/查找/合併/反轉/移除,以及字串拼接/長度/索引/字元存取/去空白/替換/比較/大小寫/分割/格式化/三大類別對比,附代碼範例與效能建議。

一、陣列核心操作

1. 宣告與初始化 (兩種語法等價)

int[] arr1 = new int[]{1, 3, 5, 7, 9}; // 顯式 new
int[] arr2 = {2, 4, 6, 8, 10};         // 簡寫 (僅限宣告時)
int[][] matrix = new int[3][4];        // 多維陣列

2. 遍歷方式

// 索引 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);

3. Arrays 工具類常用靜態方法

| 方法 | 用途 | 範例 | |------|------|------| | 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(); |

4. 進階操作 (Apache Commons Lang / Guava)


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

5. 檢查陣列包含某值 (純 JDK)

String[] strArr = {"a", "b", "c"};
boolean hasA = Arrays.asList(strArr).contains("a"); // true (裝箱開銷較大)
boolean hasA2 = Arrays.stream(strArr).anyMatch("a"::equals); // 推薦 Stream

二、字串核心操作

1. 建立與拼接

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+)

2. 長度、索引、字元存取

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'

3. 去除空白

String s = "  Hello Java  ";
s.trim();                    // "Hello Java" (僅首尾)
s.strip();                   // Java 11+ Unicode 感知
s.replaceAll("\\s+", "");    // "HelloJava" (全域含中間)

4. 替換

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 全域)

5. 比較 (核心陷阱)

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

6. 大小寫轉換

String s = "hello WORLD";
s.toLowerCase();   // "hello world"
s.toUpperCase();   // "HELLO WORLD"
// 區域敏感: s.toLowerCase(Locale.TRADITIONAL_CHINESE)

7. 分割

"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+ 無空字串)

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 vs StringBuilder vs StringBuilder

| 特性 | 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% (鎖開銷)

四、避坑與最佳實踐清單

  1. 陣列長度不可變:需動態增刪請用 ArrayList / List。
  2. 字串拼接在迴圈中必須用 StringBuilder:避免 O(n²) 記憶體暴增與 GC 風暴。
  3. 比較字串內容永遠用 equals():== 僅比較參考,常量池情況不可靠。
  4. 正則特殊字元需轉義:split(".") 錯誤 → split("\\.");replaceAll("$", "x") 錯誤 → replaceAll("\\$", "x")。
  5. 大量字串操作考慮 CharSequence / StringJoiner (Java 8+):StringJoiner sj = new StringJoiner(",", "[", "]"); 可直接生成 [a,b,c] 格式。
  6. 陣列轉 List 注意裝箱:Arrays.asList(1,2,3) 回傳固定長度 List,不可增刪;new ArrayList<>(Arrays.asList(...)) 才可變。

總結

陣列提供**記憶體緊湊、隨機存取 O(1)** 的基礎容器;字串作為**不可變字元序列**保證執行緒安全與常量池複用。掌握 Arrays/ArrayUtils、StringBuilder、String.format/DateTimeFormatter 三大工具組合,即能高效、優雅地處理 90% 以上的資料轉換與展示需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved