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

Java String 類核心機制與常用方法全解析(下):不可變性、內存模型與 API 實戰

     編輯:Java 綜合教學

String 不可變性原理與內存圖解

String 對象一旦創建,其內部 char[] value 數組永不改變。所謂「修改」實為創建新對象,引用指向新內存地址。

內存引用變化演示

String s1 = "慕課網";
s1 = "歡迎來到:" + s1; // 實際過程:
// 1. 創建 StringBuilder
// 2. append("歡迎來到:")
// 3. append(s1)
// 4. toString() 產生新字符串對象
// 5. s1 引用指向新對象,原 "慕課網" 對象若無其他引用將被 GC

字符串常量池 vs 堆內存對比

創建方式存儲位置同內容多次創建
String s = "abc"常量池同一對象(編譯器優化)
new String("abc")堆內存每次新對象
"a" + "b" (編譯期常量)常量池優化為 "ab"
"a" + s (含變量)堆內存運行時新對象
String s1 = "imooc", s2 = "imooc";
String s3 = "I love" + s1; // 運行時拼接 → 堆
String s4 = "I love " + s1; // 同上

System.out.println(s1 == s2); // true (常量池同一引用)
System.out.println(s1 == s3); // false (堆 vs 常量池)
System.out.println(s3 == s4); // false (兩次獨立運行時拼接)

核心 API 分類速查表

1. 查找與判斷

  • charAt(int index):返回指定索引字符
  • indexOf(String str):首次出現索引,無則 -1
  • startsWith/endsWith:前綴/後綴匹配
  • equals(Object o):內容比較(必須用此而非 ==)
  • equalsIgnoreCase:忽略大小寫比較

2. 大小寫轉換與修剪

  • toLowerCase()/toUpperCase():返回新字符串
  • trim():移除首尾空白字符(含 \t \n \r)

3. 截取與替換

  • substring(int begin, int end):含頭不含尾,[begin, end)
  • replace(char old, char new) / replace(CharSequence, CharSequence):全量替換
  • replaceAll(String regex, String replacement):正則替換

4. 分割與轉換

  • split(String regex):正則分割返回數組,尾部空串默認丟棄,需 split(regex, -1) 保留
  • valueOf(primitive):基本類型 → String,等同 String.valueOf()
  • toCharArray():轉字符數組(拷貝)
  • getBytes(Charset):編碼為字節數組,指定編碼避免亂碼

高頻陷阱與最佳實踐

  1. 頻繁拼接用 StringBuilder/StringBuffer:循環內 += 會產生大量臨時對象,導致 GC 壓力;
  2. intern() 慎用:手動入常量池,JDK 7+ 池移至堆,大量調用易觸發 OOM;
  3. 比較內容永遠用 equals():== 比較引用地址,極易產生邏輯 Bug;
  4. split 正則特殊字符需轉義:split("\\|")、split("\\.");
  5. 編碼轉換顯式指定 Charset:str.getBytes(StandardCharsets.UTF_8)。

性能對比參考

操作	                    相對耗時 (百萬次循環)
String +=	              12000 ms
StringBuilder.append	    5 ms
StringBuffer.append	    8 ms (線程安全開銷)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved