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

計算機程序思維邏輯 (29):String 類深度解析

     編輯:Java 綜合教學

一、String 基本用法

String name = "老馬說編程";           // 常量池
String name2 = new String("老馬說編程"); // 堆對象
name += "說編程"; // 底層用 StringBuilder
String desc = ",探索編程本質";
System.out.println(name + desc); // 老馬說編程,探索編程本質

常用方法速查

  • isEmpty()、length()
  • substring(begin, end)
  • indexOf/lastIndexOf 查找字符/子串
  • contains(CharSequence)
  • startsWith/endsWith
  • equals/equalsIgnoreCase
  • compareTo/compareToIgnoreCase
  • toUpperCase/toLowerCase
  • concat/replace/trim
  • split(regex) 正則分割

二、String 內部實現

1. 封裝 char 數組

private final char value[];

構造器會拷貝傳入數組,不直接引用。核心方法均操作此數組。

2. 按 Code Point 處理(支持增補字符)

codePointAt(index), codePointBefore(index), codePointCount(begin, end), offsetByCodePoints(index, offset)

3. 編碼轉換

內部用 UTF-16BE。Charset 類處理編碼:

Charset.defaultCharset() // 系統默認編碼
Charset.forName("GB18030") // 指定編碼
// String 轉 byte[]
getBytes(), getBytes(charsetName), getBytes(Charset)
// byte[] 轉 String
new String(bytes, charsetName), new String(bytes, Charset)

三、不可變性設計

  • 類 final,不可繼承
  • value 數組 final,引用不可變
  • 所有「修改」方法實為創建新對象,如 concat() 內部 Arrays.copyOf + new String()

優點:線程安全、可共享、Hash 緩存可靠。缺點:頻繁修改性能差,改用 StringBuilder/StringBuffer。

四、字符串常量池

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true,指向常量池同一對象

String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3 == s4); // false,堆中兩個對象
System.out.println(s3.equals(s4)); // true,內容相同

常量池保證字面量唯一,new 強制創建新對象。

五、hashCode 實現與緩存

private int hash; // 默認 0
public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        for (char c : value) h = 31 * h + c;
        hash = h;
    }
    return h;
}

算法:s[0]*31^(n-1) + ... + s[n-1]。31 選擇因:散列均勻、31*h == (h<<5)-h 移位高效。

六、正則相關方法

  • split(regex)
  • matches(regex)
  • replaceFirst/replaceAll(regex, replacement)

複雜正則建議用 Pattern/Matcher。

七、小結

String 核心:不可變 char 數組封裝、常量池優化、編碼轉換橋樑、Hash 緩存。下期講 StringBuilder/StringBuffer。

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