簡體   English   中英

字符串intern()方法使用混亂

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM