關於Java中的String類知識點小總結

Java中的String類知識點

前言

在 Java 中字元串屬於對象,Java 提供了 String 類來創建和操作字元串。

如何創建字元串

  • 最簡單的方式

    String str = "hello";
    
  • 因為字元串屬於對象,所以和其它對象一樣,可以使用關鍵字和構造方法來創建 String 對象。

    String s2 = new String("hello");
    

儲存位置

String 創建的字元串存儲在公共池中,而 new 創建的字元串對象在堆上。

特性

String 類是是immutable(不可變)的,所以你一旦創建了 String 對象,那它的值就無法改變 WHY?

查看源碼後可以發現源碼使用的是final修飾符

public final class String
String s = "old";
System.out.println("s=" + s);

s = "new";
System.out.println("s=" + s);

從輸出結果上看是改變了,但為什麼還說String對象是不可變的呢?

s 只是一個 String 對象的引用,並不是對象本身,當執行 s = “new”; 創建了一個新的對象 “new”,而原來的 “old” 還存在於記憶體中

length() 方法,length 屬性和 size() 方法的區別:

  • length 屬性是針對 Java 中的 數組 來說的,要求數組的長度可以用其 length 屬性;
  • length() 方法是 針對 字元串 來說的,要求一個字元串的長度就要用到它的length()方法;
  • Java 中的 size() 方法是針對 泛型集合 說的, 如果想看這個泛型有多少個元素, 就調用此方法來查看
String array[] = {"first", "second", "third"};//字元串數組
String a = "hello";//字元串
ArrayList<String> list = new ArrayList<>();
list.add(a);
System.out.println("數組array的長度為" + array.length);
System.out.println("字元串a的長度為" + a.length());
System.out.println("list中元素個數為" + list.size());//結果為3 5 1

常見的字元串比較

/**
 * 1.儲存位置不一樣。常量池和堆記憶體中
 * 2."=="比較的是對象的地址 "equals"比較的是值
 */
String s1 = "abc";            // 常量池
String s2 = new String("abc");     // 堆記憶體中
System.out.println(s1 == s2);        // false兩個對象的地址值不一樣。
System.out.println(s1.equals(s2)); // true


/**
 * 先在常量池中創建 ab ,地址指向 s3, 再創建 abc ,指向 s4。
 * 對於 s5,先創建StringBuilder(或 StringBuffer)對象,通過 append 連接得到 abc ,再調用 toString() 轉換得到的地址指向 s5。
 * 故 (s5==s4) 為 false。
 */
String s3="ab";
String s4="abc";
String s5=s3+"c";
System.out.println(s5==s4);         // false
System.out.println(s5.equals(s4));  // true

Java中的String、StringBuffer 和 StringBuilder 的區別

  • String: 字元串常量,字元串長度不可變。用於存放字元的數組被聲明為final的,因此只能賦值一次,不可再更改。
  • StringBuffer:字元串變數(Synchronized,即執行緒安全)。
    • 如果要頻繁對字元串內容進行修改,出於效率考慮最好使用 StringBuffer
    • 如果想轉成 String 類型,可以調用 StringBuffer 的 toString() 方法。
    • Java.lang.StringBuffer 執行緒安全的可變字元序列。在任意時間點上它都包含某種特定的字元序列,但通過某些方法調用可以改變該序列的長度和內容。可將字元串緩衝區安全地用於多個執行緒。
  • StringBuilder:字元串變數(非執行緒安全)。在內部 StringBuilder 對象被當作是一個包含字元序列的變長數組。

使用的基本原則

  • 操作少量的數據用 String
  • 單執行緒操作大量數據用StringBuilder
  • 多執行緒操作大量數據,用StringBuffer