關於Java中的String類知識點小總結
- 2020 年 12 月 18 日
- 筆記
- BasisOfJava
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