一. 介紹
String 是Java.long包下的String類,是一個特殊的參考型別,用于表示字串,它提供了許多方法來操作和處理字串,比如連接、截取、查找、替換等,String類內部使用字符陣列( char[] ) 來存盤字串的內容,value欄位被final修飾,String物件一旦創建后,其值就不可改變,String物件的值存盤在常量池中,每次修改操作都會創建一個新的字串物件,并且如果常量池中已經存在相同內容的字串,就會直接參考該字串而不創建新物件,
String 常見的兩種賦值方式:
1. 直接賦值:通過使用雙引號將字串文字包圍起來進行賦值,例如:String str = "Hello World!";
2. 建構式:通過呼叫String類的建構式來創建字串物件并進行賦值,例如:String str = new String("Hello World!");
二. 執行程序
在了解執行程序前,先明白常量池的作用,String為什么要參考常量池?
String類參考常量池的目的是提高記憶體利用率和性能,常量池是Java虛擬機中用于存盤字串常量的一塊區域,它位于堆區之外,屬于方法區的一部分,
當我們使用雙引號創建一個字串物件時,如果常量池中已經存在相同內容的字串,則不會再創建新的物件,而是直接參考已存在的字串物件,這樣可以節約記憶體空間,避免不必要的物件創建,
另外,String類的一些常用方法如equals()和hashCode()等都依賴于常量池的參考,如果不使用常量池,那么每次字串比較和哈希計算都需要逐個字符比較,效率較低,而通過參考常量池,可以利用字串物件的唯一性快速進行比較和哈希計算,提高了程式的執行效率,
總而言之,參考常量池可以有效地節省記憶體開銷,并提升字串操作的性能,
1. 直接賦值的執行程序:
- 編譯階段,當遇到一個字串直接賦值的陳述句,例如:String str = "Hello"; 編譯器會查詢該字符在常量池("Hello")在常量池中是否存在;
如果常量池中不存在相同的字串"Hello",則會在常量池創建新的字串物件;
如果常量池中存在相同字串"Hello",則直接回傳該字串的參考;
- 運行階段,變數 String str 會在堆疊記憶體中占用空間,JVM會將字串常量的參考指向變數str,這樣,變數str就參考了常量池中的字串物件,
2. 建構式的執行程序:
- 編譯階段:如果傳入的引數是字串常量,例如:String str = new String("hello"); 編譯器會在編譯期間將其作為字串常量處理,并在常量池中創建一個對應的字串物件,如果已經存在相同內容的字串常量,則不會重復創建,而是共享已存在的物件,
- 運行階段:String str = new String() 左進堆疊 ,右進堆;先進堆疊,后進堆;
在堆疊記憶體上分配空間,創建一個名為str的參考變數,用來存盤參考地址;
在堆記憶體中創建一個新的String物件,并參考常量池中的字串地址,
三. 區別
1. 記憶體分配
String str = "hello" 的方式 JVM 會將其分配到常量池中,此時僅產生一個字串物件的記憶體空間,
String str = new String("hello”),會在堆記憶體中new一個物件,若常量池中沒有該參考,則會在創建在常量池中創建新的字串,因此使用new String() 會比直接賦值占用記憶體多,
2. 靈活度
String str = "hello" ,僅支持字串之間的參考了;
String str = new String("hello”) ,構造方法提供了更靈活的方式來創建字串物件,并且可以通過轉換型別的功能滿足不同的需求,需要注意的是,這些構造方法創建的字串物件是不可變的,即不能修改其內容,
四. 擴展
String中的構造方法,支持哪種型別轉換

構造方法使用方式:
public static void main(String[] args) throws UnsupportedEncodingException { byte[] bytes = {99, 100, 101, 102}; // public String(byte bytes[]) // 通過使用平臺的默認字符集解碼指定的位元組陣列來構造新的 String , String str1 = new String(bytes); System.out.println(str1); // public String(byte bytes[], Charset charset) // 指定字符集,構建一個新的String字串 // bytes[]:位元組陣列,包含要構建字串的字符, // charset: charset引數指定要使用的字符集 Charset charset = Charset.forName("UTF-8"); String str2 = new String(bytes, charset); System.out.println(str2); // public String(byte bytes[], int offset, int length) // 將位元組陣列中的一部分截取出來變成一個字串 offset指的是偏移量或者索引 // bytes:要轉換的位元組陣列, // offset:開始轉換的位置,即位元組陣列的起始索引, // length:要轉換的位元組長度,即要轉換的位元組數, String str3 = new String(bytes, 1, 2); System.out.println(str3); // public String(byte bytes[], String charsetName) // 構造一個新的String由指定用指定的位元組的陣列解碼charset , // byte陣列(bytes[]):表示要用于構造字串的位元組陣列, // 字符集名稱(String charsetName):表示將位元組陣列轉換為字串時,字符集的String型別的名字, String str4 = new String(bytes, "utf-8"); //解碼需要拋例外 System.out.println(str4); // public String(char value[]) // 使用字符陣列構建新的字串 char[] chars = {'a', 'b', 'c', 'd', 'e'}; String str5 = new String(chars); System.out.println(str5); // public String(char value[], int offset, int count) // 構造方法通過將字符陣列的一部分轉換為字串來創建新的字串物件, // value:字符陣列,包含要構建字串的字符, // offset:整數,指定字符陣列中要開始構建字串的起始位置的偏移量, // count:整數,指定從起始位置開始構建字串的字符數量, String str6 = new String(chars, 2, 3); System.out.println(str6); // public String(int[] codePoints, int offset, int count) // 傳入int作為引數,構建新的String字串,這個int是這個字對應的Unicode(16進制數) // codePoints:一個包含 Unicode 碼點的整數陣列, // offset:指定從 codePoints 陣列的哪個位置開始獲取碼點, // count:指定要使用的碼點數量, // 該方法會根據提供的碼點陣列,從指定位置開始取出指定數量的碼點,并將它們組合成一個字串, // 需要注意的是,每個碼點都代表一個字符,而不是位元組,在 Java 中,Unicode 字符以碼點的形式表示,其中一些字符可能由多個碼元(code unit)組成, int[] codePoints = {104, 101, 108, 108, 111}; String str7 = new String(codePoints, 1, 4); // 在代碼示例中使用的碼點是整數值,可以直接使用對應字符的 ASCII 碼來表示, System.out.println(str7); // public String(String original) // 常使用的方法 // original:要復制到新String物件中的字串, String str8 = new String("Hello"); System.out.println(str8); // public String(StringBuffer buffer) // 將StringBuffer轉換為String,并且在需要不可變字串的場景中更加適用, StringBuffer sbf = new StringBuffer("Hello"); String str9 = new String(sbf); System.out.println(str9); // public String(StringBuilder builder) StringBuilder sb = new StringBuilder("Hello"); String str10 = new String(sb); System.out.println(str10); } 輸出結果: cdef de cdef abcde cde ello Hello Hello Hello
完!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556919.html
標籤:其他
上一篇:springboot組態檔
下一篇:返回列表
