2

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

下面是我的代码。

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]:: 假

在这里,我有两个疑问。

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

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

请指导。

4

2 回答 2

4

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

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

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

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

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

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

于 2015-03-25T05:42:26.843 回答
3

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

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

封装的全部意义在于允许在不影响客户端代码的情况下进行更改。你应该遵守“规则”,这样你就不会被咬。

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

于 2015-03-25T05:37:17.590 回答