更新時間:2022-09-22 09:23:10 來源:動力節(jié)點 瀏覽796次
了解Java 中的 String 類、使其不可變背后的動機(jī)以及關(guān)于String常量池的整個想法。當(dāng)我們通過 String 字面量或 String 構(gòu)造函數(shù)創(chuàng)建 String 實例時,我們將看到如何操作內(nèi)存。
字符串是一個字符序列。在 Java 中,與其他編程語言類似,字符串是預(yù)定義類型的一部分。Java 有java.lang.String類,其實例代表字符串。
該類String是一個不可變的類。不可變意味著String一旦創(chuàng)建了它的實例就不能更改。
通常,許多敏感信息(用戶名、密碼、URL、端口、數(shù)據(jù)庫、套接字連接)都以字符串的形式表示和傳遞。通過使這些信息不可變,代碼變得安全,可以抵御各種安全威脅。
字符串不變性還允許緩存字符串文字,這允許應(yīng)用程序使用大量字符串文字,而對堆內(nèi)存和垃圾收集器的影響最小。
在可變上下文中,對字符串文字的修改可能會導(dǎo)致變量損壞。
Java中的內(nèi)存分為三個部分,即堆、棧和字符串池。字符串常量池是用于存儲字符串文字的特殊區(qū)域。
請注意,在 Java 7 之前,字符串池是永久代內(nèi)存區(qū)域的一部分。
從 Java 7 開始,字符串與應(yīng)用程序創(chuàng)建的其他對象一起分配在 Java 堆區(qū)域中。
后來,在 Java 8 中,永久代已被完全刪除。
因此,在最新的 JVM 中,字符串池是堆內(nèi)存中分配用于存儲字符串文字的特殊區(qū)域。
在 Java 中,字符串字面量是使用雙引號創(chuàng)建的字符串,而字符串對象是使用new()運(yùn)算符創(chuàng)建的字符串。
請注意,字符串字面量是在字符串池區(qū)域中創(chuàng)建的,而字符串對象是在堆內(nèi)存區(qū)域中創(chuàng)建的。
String strLiteral = "Hello World";
String strObj = new String("Hello World");
假設(shè)我們要創(chuàng)建兩個內(nèi)容相同的字符串“ howtodoinjava”。如果內(nèi)容為“ howtodoinjava”的字符串已經(jīng)存在,那么新的文字將指向已經(jīng)存在的文字。對于 String 對象,每次都會在堆中創(chuàng)建一個新的 String 對象。
讓我們看一個例子。
String a = "howtodoinjava";
String b = "howtodoinjava";
System.out.println(a == b); //true
在上面的程序中,我們創(chuàng)建了兩個具有相同內(nèi)容的字符串文字。在字符串池中創(chuàng)建 'a' 后,下一個字符串字面量 ' b' 指向內(nèi)存區(qū)域中的同一個對象,所以'a == b'是true。
String a = "howtodoinjava";
String b = "howtodoinjava";
System.out.println(a == b);
String c = new String("howtodoinjava");
System.out.println(a == b); //true
System.out.println(b == c); //false
我們知道字符串字面量是在字符串池中創(chuàng)建的,而字符串對象是在堆內(nèi)存區(qū)域中創(chuàng)建的。
我們可以使用方法String.intern()為字符串對象創(chuàng)建字符串字面量。當(dāng)在字符串對象上調(diào)用時,方法intern()會在堆內(nèi)存中創(chuàng)建字符串對象的精確副本,并將其存儲在字符串常量池中。
String a = "howtodoinjava";
String b = "howtodoinjava";
String c = new String("howtodoinjava");
String d = c.intern();
在上面的示例中,字符串 a, b 和d將引用 SCP 中的相同字符串文字。該字符串c將繼續(xù)指向堆中的對象。
初級 202925
初級 203221
初級 202629
初級 203743