Java 字符串引用

Java String references

当我运行下面的代码

public class Test {
    public static void main(String[] args) {
        System.out.println(args[0]);
        System.out.println("testing");
        System.out.println(args[0] == "testing");
    }
}

使用

java Test testing

在命令行中,它打印以下内容:

测试
测试

我的理解是,在比较字符串时,==比较的是字符串的引用,而不是它们的值。下面代码中的两个String,如何找出它们的引用是什么?

System.out.println(args[0] == "testing");

比较Strings时可以用equals()compareTo()equalsIgnoreCase()

如果你想对内存位置做一些我不确定你为什么想要做的事情,你只需要引用。

这违背了 Java 的目的,如果这是您正在寻找的或者如果您想对内存地址执行操作,您应该切换到 C。

My understanding is that, when comparing Strings, == compares the references of the Strings, not their values

确实;但是然后将上面句子中的 String 替换为 Object,或者实际上 any class 实现 Object(这意味着,本质上, each and every Java class) 和上面的句子都成立...

只是 "values" 太模糊了。

Java有一个基础合约,就是Object.equals().hashCode()。它们之间有着内在的联系。他们本质上定义的是一个等价契约。

Object 的基本等价合同很简单,真的;给定两个 Objects o1o2,这是真的:

o1.equals(o2)

严格等同于:

o1 == o2

但这只是因为对于Object.equals()是这样定义的:

// pseudo code...
public boolean equals(final Object o)
{
    returns this == o;
}

现在,当然,这不适用于 StringString 有状态(它的字符),Object 没有。因此String"refines".equals()。这意味着即使您有:

String s1 = "hello world";
String s2 = "hello world";

不正确

s1 == s2

(除了特定的、不相关的场景),但 是真的:

s1.equals(s2)

作为"side effect",这也意味着String也必须"refine" .hashCode(),因为合同明确规定两个对象是equals() 必须有相同的 hashCode().