比较命令行参数引用 return false 而字符串数组 return true

Comparing command line arguments reference return false while array of String return true

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

下面是我的代码。

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:: true
str1==str3:: false
strArray[0]==strArray[1]:: true
str1==strArray[1]:: true
strArray1[0]==strArray1[1]:: true
str1==strArray1[1]:: true
args[0]==args[1]:: false

这里我有两个问题。

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

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

请指导。

如果您只想比较内容,请不要 检查参考文献。这就是 String class 首先提供 equals() 方法的原因。前者测试引用相等性,后者测试值相等性。

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

封装的整个 要点 是允许在不影响客户端代码的情况下在幕后更改内容。你应该遵守 "rules" 这样你就不会被咬了。

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

if i compare reference of String str1==str3 then it will return false because str3 is created using new String so that will not reside in String pool, So how str1==strArray1[1] return true??

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

strArray[0]==strArray[1] will return true, strArray1[0]==strArray1[1] also return true then why command line argument args[0]==args[1] return false?

args[0]==args[1]returnsfalse,因为它们是2个不同的个实例(没有加入String池),它们就像new String()。 您可以使用 :

轻松测试它
    System.out.println(System.identityHashCode(args[0]));
    System.out.println(System.identityHashCode(args[1]));

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