当我运行以下代码时
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测试测试
在命令行中,它打印以下内容:
测试
测试
假
我的理解是,在比较字符串时,==比较字符串的引用,而不是它们的值。对于以下代码中的两个字符串,我如何找出它们的引用?
System.out.println(args[0] == "testing");
答案 0 :(得分:2)
比较equals()
时,您可以使用compareTo()
,equalsIgnoreCase()
,Strings
。
如果您想对内存位置执行某些操作,我只需要参考,但我不确定您为什么要这样做。
这违背了Java的目的,你应该切换到C,如果这是你正在寻找的,或者你想对内存地址执行操作。
答案 1 :(得分:0)
我的理解是,在比较字符串时,==比较字符串的引用,而不是它们的值
实际上;但是然后在上面的句子中用String
替换Object
,或者确实实现Object
的任何类(实际上,这意味着每个Java类)和上述句子将举行......
除了“价值”太模糊。
Java中有一个基本合同,即Object
的{{1}}和.equals()
。它们本质上是彼此联系在一起的。他们基本上定义的是等价合同。
.hashCode()
的基本等价合同很简单,真的;给定两个Object
s Object
和o1
,确实如此:
o2
严格等同于:
o1.equals(o2)
但这仅仅是因为o1 == o2
,Object
被定义为:
.equals()
现在,当然,// pseudo code...
public boolean equals(final Object o)
{
returns this == o;
}
不适用。 String
有状态(字符),String
没有。因此Object
“精炼”String
。这意味着,即使你有:
.equals()
不正确:
String s1 = "hello world";
String s2 = "hello world";
(除了特定的,不相关的情况),但 为真:
s1 == s2
作为“副作用”,这也意味着s1.equals(s2)
也必须“细化”String
,因为合同明确规定.hashCode()
的两个对象必须具有同样的equals()
。