【问题标题】:String.intern() how exactly workString.intern() 究竟是如何工作的
【发布时间】:2013-07-08 14:10:26
【问题描述】:

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

   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() 返回以引用实习实例吗? args0args1 仍然是数组中原始的不同实例。
  • 关于 String.intern 的有用信息:stackoverflow.com/questions/1091045/…
  • @XaviLópez 是的,你是对的,忘记输入了。现在改正
  • @Rollerball 您的编辑没有帮助,因为代码有效,但您的问题说无效。

标签: java string char


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你必须这样做:

    if (args0.intern() == args1.intern()){
        System.out.println("Success");
    }
    

    【讨论】:

      【解决方案3】:

      字符串是不可变的

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

      你正在扔掉这个实例。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            之后

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

            args0args1 仍然保存命令行中使用的字符串,因此它们与池中的字符串不同。

            改变它试试吧

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

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

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

            【讨论】:

              猜你喜欢
              • 2011-06-26
              • 2021-08-15
              • 2012-06-08
              • 2011-10-11
              • 2013-07-05
              • 1970-01-01
              • 1970-01-01
              • 2014-09-29
              • 2011-06-01
              相关资源
              最近更新 更多