簡體   English   中英

String.intern()到底如何工作

[英]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");
}

在您的示例中, args0args1仍在引用數組中的原始不同實例。

你必須做:

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());
   }
}

(我假設args0args1持有具有相同值的字符串)

  1. args0.intern()將檢查字符串池是否已包含與args0中的String具有相同值的String。
  2. 如果pool包含對它的此類String引用,則將返回,如果不是,則創建與args0值相同的新String,並將其放置在返回的Pool引用中。

args0.intern();
args1.intern();

args0args1仍保留命令行中使用的字符串,因此它們與池中的字符串不同。

要改變它,也許嘗試

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.

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