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
的基本等价合同很简单,真的;给定两个 Object
s o1
和 o2
,这是真的:
o1.equals(o2)
严格等同于:
o1 == o2
但这只是因为对于Object
,.equals()
是这样定义的:
// pseudo code...
public boolean equals(final Object o)
{
returns this == o;
}
现在,当然,这不适用于 String
。 String
有状态(它的字符),Object
没有。因此String
"refines".equals()
。这意味着即使您有:
String s1 = "hello world";
String s2 = "hello world";
不正确:
s1 == s2
(除了特定的、不相关的场景),但 是真的:
s1.equals(s2)
作为"side effect",这也意味着String
也必须"refine" .hashCode()
,因为合同明确规定两个对象是equals()
必须有相同的 hashCode()
.
当我运行下面的代码
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
的基本等价合同很简单,真的;给定两个 Object
s o1
和 o2
,这是真的:
o1.equals(o2)
严格等同于:
o1 == o2
但这只是因为对于Object
,.equals()
是这样定义的:
// pseudo code...
public boolean equals(final Object o)
{
returns this == o;
}
现在,当然,这不适用于 String
。 String
有状态(它的字符),Object
没有。因此String
"refines".equals()
。这意味着即使您有:
String s1 = "hello world";
String s2 = "hello world";
不正确:
s1 == s2
(除了特定的、不相关的场景),但 是真的:
s1.equals(s2)
作为"side effect",这也意味着String
也必须"refine" .hashCode()
,因为合同明确规定两个对象是equals()
必须有相同的 hashCode()
.