[英]String intern() method usage confusion
我們對通過新String()創建的字符串使用intern()方法,以便它們將在字符串池中創建一個條目,並從字符串池返回新創建的字符串,以便此創建的字符串適合與==運算符一起使用(據我了解)。
那么通過構造函數創建新的String有什么用?
什么時候應該使用構造函數創建新的String?
新的String()最多可以創建兩個String對象,至少一個。 一個在常量池中(如果常量池中不存在),另一個在堆內存中。 常量池條目是通過InterString對象創建的。
實習生將在常量池中創建String Literal,以便每當您創建不帶new關鍵字的String時,都不會創建字符串對象。
假設您已經創建為
String str= new String("abc");
將在常量池中創建兩個對象(如果常量池中不存在“ abc”)。 jvm將內部調用該對象的intern。 所以下次如果你在做
String str1= "abc";
不會將任何條目添加到常量池中,因為對於相同的文字,只能在常量池中添加條目。
public native String intern(); java doc says,
最初為空的字符串池由> {@ code String}類私下維護。 調用intern方法時,如果池中已經包含一個由{@link #equals(Object)}方法確定的等於此{@code String}對象的字符串,則返回該池中的字符串。 否則,將此{@code String}對象添加到池中,並返回對此{@code String}對象的引用。 因此,對於任意兩個字符串{@code s}和{@code t},{@ code s.intern()==> t.intern()}為{@code true},當且僅當{@code s.equals(t)}是{@code> true}。
讓我們考慮一個例子:
String temp1 = new String("abcd");
這意味着將在heap memory
創建一個新對象"abcd"
並將其引用鏈接到temp1
。
String temp2 = new String("abcd").intern();
這意味着將在String Pool
檢查"abcd"
文字。 如果已經存在,則其引用將鏈接到新創建的temp2
。 否則,將在String Pool
創建一個新條目,並將其引用鏈接到新創建的temp2
。
String temp3 = "abcd";
這意味着將在String Pool
檢查"abcd"
文字。 如果已經存在,則其引用將鏈接到新創建的temp2
。 否則,將在String Pool
創建一個新條目,並將其引用鏈接到新創建的temp3
。 由此得出結論, Java自動插入String常量 。
讓我們考慮另一個示例:
String s1 = "string-test";
String s2 = new String("string-test");
String s3 = new String("string-test").intern();
if ( s1 == s2 ){
System.out.println("s1 and s2 are same");
}
if ( s2 == s3 ){
System.out.println("s2 and s3 are same" );
}
if ( s1 == s3 ){
System.out.println("s1 and s3 are same" );
}
輸出: s1 and s3 are same
現在何時使用= " "
或使用new String(" ")
創建String對象?
我遇到的一個用例
// imagine a multi-megabyte string here String s = "0123456789012345678901234567890123456789"; String s2 = s.substring(0, 1); s = null;
現在,您將擁有一個String s2,盡管它似乎是一個單字符的字符串,但它包含對在String中創建的巨大char數組的引用。 這意味着即使我們顯式使String無效,該數組也不會被垃圾回收!
解決此問題的方法是使用String構造函數,如下所示:
String s2 = new String(s.substring(0, 1));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.