【问题标题】:Comparing command line arguments reference return false while array of String return true [duplicate]比较命令行参数参考返回 false 而字符串数组返回 true [重复]
【发布时间】:2016-01-29 07:01:29
【问题描述】:

目前我正在处理字符串操作,在进行演示时我发现了一些不同的行为。

下面是我的代码。

public class HelloWorld{

 public static void main(String []args){
    String str1 = "Hello";
    String str2 = "Hello";
    String str3 = new String("Hello");

    String strArray[] = {"Hello","Hello"};
    String strArray1[] = new String[] {"Hello","Hello"};

    System.out.println("str1==str2::  "+(str1==str2));
    System.out.println("str1==str3::  "+(str1==str3));

    System.out.println("strArray[0]==strArray[1]::  "+(strArray[0]==strArray[1]));
    System.out.println("str1==strArray[1]::  "+(str1==strArray[1]));

    System.out.println("strArray1[0]==strArray1[1]::  "+(strArray1[0]==strArray1[1]));
    System.out.println("str1==strArray1[1]::  "+(str1==strArray1[1]));

    System.out.println("args[0]==args[1]::  "+(args[0]==args[1]));
 }

}

上面的代码是。我正在运行传递命令行参数的代码。

java HelloWorld Hello Hello

str1==str2:: 真
str1==str3:: 假
strArray[0]==strArray[1]:: 真
str1==strArray[1]:: 真
strArray1[0]==strArray1[1]:: 真
str1==strArray1[1]:: 真
args[0]==args[1]:: false

这里我有两个问题。

  1. 如果我比较 String str1==str3 的引用,那么它将返回 false,因为 str3 是使用 new String 创建的,因此不会驻留在字符串池中,那么 str1 如何==strArray1[1] 返回真??

  2. strArray[0]==strArray[1] 会返回 true,strArray1[0]==strArray1[1] 也会返回 true 那么为什么命令行参数 args[0]==args[1 ] 返回错误??

请指导。

【问题讨论】:

  • 您从未向我们展示过作为命令行参数传入的值。
  • 实际上我对使用新参数和命令行参数创建的字符串数组感到困惑。
  • @TimBiegeleisen 他确实做到了
  • @TimBiegeleisen java HelloWorld Hello Hello
  • @ScaryWombat 没看到...它没有格式化为代码:-(

标签: java string command-line-arguments string-pool


【解决方案1】:
如果您只想比较内容,

不要检查参考资料。这就是String 类首先提供equals() 方法的原因。前者测试引用相等,后者测试值相等。

过去,内部处理字符串的方式发生了变化,而且将来很可能会发生变化。使用引用相等依赖于你不应该依赖的实现细节。

封装的整个是允许事情在幕后改变而不影响客户端代码。你应该遵守“规则”,这样你就不会被咬了。

如果你真的想了解它是如何工作的,你应该阅读 Java 语言规范,here。这是该语言的标准,任何未明确说明的实施细节都应该是无关紧要的。

【讨论】:

  • 谢谢。但我想知道它是如何工作的以及哪些字符串将驻留在字符串池中。
  • @Pratik 为什么?你会用这些知识做什么?如果只是好奇,没关系。但是请不要在编写程序时使用这些知识,因为正如 paxdiablo 所解释的,这是一个实现细节,您不应该编写依赖于实现细节的程序。
  • 是的,这只是好奇,因为想知道,String 在不同情况下的工作原理。
【解决方案2】:

如果我比较 String str1==str3 的引用,那么它将返回 false 因为 str3 是使用 new String 创建的,所以它不会驻留在 字符串池,那么str1==strArray1[1]如何返回true??

String strArray1[] = new String[] {"Hello","Hello"}; 创建一个新的字符串数组,其中引用了数组* 内的相同字符串 "hello"

strArray[0]==strArray[1] 将返回 true,strArray1[0]==strArray1[1] 也返回 true 那么为什么命令行参数 args[0]==args[1] 返回假?

args[0]==args[1] 返回false,因为它们是2 个不同 实例(未添加到字符串池中),它们就像new String()。 您可以使用以下方法轻松测试:

    System.out.println(System.identityHashCode(args[0]));
    System.out.println(System.identityHashCode(args[1]));

因此,传递给main() 的参数不会添加到字符串常量池

【讨论】:

  • 我将在此处添加字符串 literals,它被传递给除main 之外的任何方法,它们等于 do 被添加到字符串常量中游泳池。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 2021-10-05
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多