[英]String.intern() how exactly work
我想知道為什么在以下代碼中:
String args0 = args[0];
String args1 = args[1];
args0.intern();
args1.intern();
if (args0==args1){
System.out.println("Success");
} else {
System.out.println("Failure");
}
通過將2個相同的字符串作為行命令參數傳遞,它會failure
。
提前致謝。
由於String
不可變的,因此您需要分配實例intern()
返回值,以使變量引用被實例化的實例,以便==
比較將返回true
。
String args0 = args[0];
String args1 = args[1];
args0 = args0.intern();
args1 = args1.intern();
if (args0==args1){
System.out.println("Success");
} else {
System.out.println("Failure");
}
在您的示例中, args0
和args1
仍在引用數組中的原始不同實例。
你必須做:
if (args0.intern() == args1.intern()){
System.out.println("Success");
}
字符串是不可變的 。
.intern()
返回.intern()
的(可能) 不同的 String實例。
您正在丟掉這個實例。
Java自動插入String文字。 這意味着在許多情況下,==運算符似乎適用於String,其處理方式與ints或其他原始值相同。
由於Interning對於String文字是自動的,因此intern()
方法將用於使用new String()
構造的new String()
。
您也可以參考此示例:
public class Test
{
public static void main(String args[]){
String Str1 = new String("Welcome to Tutorialspoint.com");
String Str2 = new String("WELCOME TO SUTORIALSPOINT.COM");
System.out.print("Canonical representation:" );
System.out.println(Str1.intern());
System.out.print("Canonical representation:" );
System.out.println(Str2.intern());
}
}
(我假設args0
和args1
持有具有相同值的字符串)
args0.intern()
將檢查字符串池是否已包含與args0
中的String具有相同值的String。 args0
值相同的新String,並將其放置在返回的Pool引用中。 后
args0.intern();
args1.intern();
args0
和args1
仍保留命令行中使用的字符串,因此它們與池中的字符串不同。
要改變它,也許嘗試
args0 = args0.intern();
args1 = args1.intern();
現在args0 = args0.intern();
會將來自args0
“ put”字符串args0
池更新args0
以保存該字符串。 之后args1 = args1.intern();
實習生將看到pool包含相同的字符串(之前與args0.intern()
放置在一起),因此將僅返回args0.intern()
字符串的引用並將其存儲在args1
下。
現在if(args0 == args1)
應該為true
因為兩個引用都將同一個String對象作為對象。
字符串是不可變的,其方法始終返回更改后的String
:
args0 = args0.intern();
args1 = args1.intern();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.