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

Java String 核心 API 速查與最佳實踐:從基礎操作到性能陷阱

     編輯:Java 綜合教學

前言

String 是 Java 使用頻率最高的類,也是面試與日常開發的核心考點。本文匯總 20+ 常用方法、內存模型、性能陷阱 及 Java 9+ 新特性,構建完整知識圖譜。

一、 基礎屬性與查詢

方法返回值說明示例
length()int字符數(char 代碼單元數)"abc".length() → 3
isEmpty()boolean長度為 0(Java 6+)"".isEmpty() → true
charAt(int index)char獲取指定位置字符"abc".charAt(0) → 'a'
codePointAt(int index)int獲取 Unicode 碼點(支持增補字符)"😀".codePointAt(0) → 128512
indexOf(String str)int首次出現索引,無則 -1"ababa".indexOf("ba") → 1
lastIndexOf(String str)int最後出現索引"ababa".lastIndexOf("ba") → 3
contains(CharSequence s)boolean是否包含子串 (Java 5+)"abc".contains("b") → true
startsWith(String prefix)boolean是否以 prefix 開頭"abc".startsWith("a") → true
endsWith(String suffix)boolean是否以 suffix 結尾"abc".endsWith("c") → true

二、 截取與切分

方法返回值說明示例
substring(int begin)String從 begin 到結尾(含首尾)"abcd".substring(1) → "bcd"
substring(int begin, int end)String[begin, end) 左閉右開"abcd".substring(1,3) → "bc"
split(String regex)String[]正則分割,尾部空串默認丟棄"a,b,".split(",") → ["a","b"]
split(String regex, int limit)String[]limit>0 最多分割 limit 段"a,b,c".split(",",2) → ["a","b,c"]
subSequence(int start, int end)CharSequence等同 substring,實現 CharSequence 接口-

三、 大小寫與空白處理

方法說明注意
toLowerCase() / toUpperCase()使用默認 Locale,可能導致土耳其語 I 问题跨語言環境用 toLowerCase(Locale.ROOT)
trim()移除首尾 ASCII 空白 (≤U+0020)不移除全角空格、不換行符
strip() / stripLeading() / stripTrailing()Java 11+,基於 Unicode 空白字符移除推薦替代 trim()

四、 替換與轉換

方法說明示例
replace(CharSequence target, CharSequence replacement)字面替換,非正則"a.b".replace(".", "#") → "a#b"
replaceAll(String regex, String replacement)正則替換"a1b2".replaceAll("\\d", "#") → "a#b#"
replaceFirst(String regex, String replacement)替換首次匹配"a1b2".replaceFirst("\\d", "#") → "a#b2"
toCharArray()複製字符數組頻繁調用有性能開銷
getBytes(Charset charset)編碼為字節數組必須指定編碼,避免平台默認編碼差異
valueOf(Object obj)靜態工廠,null → "null"String.valueOf(123) → "123"

五、 比較與匹配

方法說明關鍵點
equals(Object anObject)內容比較,區分大小寫首選比較方式
equalsIgnoreCase(String anotherString)忽略大小寫比較性能略低於 equals
compareTo(String anotherString)字典序比較 (實現 Comparable)返回負/0/正,用於排序
compareToIgnoreCase(String str)忽略大小寫字典序-
regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)區域匹配可指定忽略大小寫
matches(String regex)全字符串正則匹配等同 Pattern.matches(regex, this)

六、 Java 9+ 現代 API (必學)

方法版本說明示例
lines()11按行分割為 Stream"a\nb".lines().count() → 2
strip() / stripLeading() / stripTrailing()11Unicode 感知去空白" \u3000a ".strip() → "a"
isBlank()11僅含空白字符(含 Unicode)" \t\n".isBlank() → true
repeat(int count)11重複拼接"ab".repeat(3) → "ababab"
indent(int n)12調整每行縮進"a\nb".indent(2) → " a\n b"
transform(Function f)12鏈式轉換s.transform(String::toUpperCase).transform(s -> s + "!")

七、 核心原理與性能陷阱

1. 不可變性與常量池

  • String s = "abc" → 常量池中創建/複用;
  • new String("abc") → 堆中強制新建對象(極少需要)。

2. 拼接性能:+ vs StringBuilder vs String.join

  • 編譯期常量折疊:"a" + "b" → "ab" (無開銷);
  • 變量拼接:循環內用 StringBuilder,單行表達式 + 編譯器自動優化為 StringBuilder;
  • Java 8+ String.join(",", list)、Java 12+ String.transform 更語義化。

3. substring 內存洩漏 (Java 6/7)

早期版本共享底層 char[],長字符串 substring 導致大數組無法回收。Java 7u6+ 已修復(複製數組)。

4. 國際化陷阱

"title".toUpperCase() // TR locale 下 → "TİTLE" (帶點 i)
"TITLE".toLowerCase() // TR locale 下 → "tıtle" (無點 i)
// 導致邏輯判斷失敗
// 修正:toUpperCase(Locale.ROOT) 或 Locale.ENGLISH

八、 實用工具類推薦

  • org.apache.commons.lang3.StringUtils:isBlank()、join()、truncate()、difference() 等豐富工具;
  • com.google.common.base.Strings:nullToEmpty()、padStart()、repeat() (Guava);
  • JDK 11+ 內置 API 已覆蓋 80%+ 常見場景,優先使用標準庫。

總結

String 看似簡單,實則暗藏 Unicode、Locale、內存模型、版本演進等深層知識。掌握本文速查表,配合 不可變性思維、顯式編碼/Locale、現代 Stream/Builder API,即可寫出正確、高效、可維護的字符串處理代碼。

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