1

我想知道为什么在以下代码中:

   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.

提前致谢。

4

6 回答 6

4

由于是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仍在引用数组中的原始不同实例。

于 2013-07-08T14:13:12.513 回答
1

你所要做的:

if (args0.intern() == args1.intern()){
    System.out.println("Success");
}
于 2013-07-08T14:12:54.193 回答
0

字符串是不可变的。

.intern()返回实习池中的(可能)不同的 String 实例。

你把这个实例扔掉了。

于 2013-07-08T14:12:31.100 回答
0

Java 自动实习生字符串文字。这意味着在许多情况下,== 运算符对字符串的工作方式与对整数或其他原始值的工作方式相同。

由于 String 文字的实习是自动的,因此该intern()方法将用于使用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());
   }
}
于 2013-07-08T14:13:20.690 回答
0

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

  1. args0.intern()将检查字符串池是否已包含与来自的字符串具有相同值的字符串args0
  2. 如果 pool 包含对它的 String 引用,则将返回,如果不是与args0将创建的具有相同值的新 String,则将其放在返回的 pool 引用中。

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

args0并且args1仍然保留命令行中使用的字符串,因此它们与池中的字符串不同。

要改变它尝试也许

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

现在args0 = args0.intern();将从args0池更新中放置“放置”字符串args0以保存该字符串。实习生之后args1 = args1.intern();会看到该池包含相同的字符串(之前用 放置args0.intern()),因此只会返回对它的引用并将其存储在args1.

现在if(args0 == args1)应该是true因为两个引用都包含相同的 String 对象。

于 2013-07-08T14:13:53.940 回答
0

字符串是不可变的,它的方法总是返回改变的String

 args0 = args0.intern();
 args1 = args1.intern();
于 2013-07-08T14:13:54.820 回答