我用 C#稍稍休息后回到了 Java ,我已经厌倦了写a.equals(b)
这样的东西所以我想知道是否有没有办法在不破坏我的程序的情况下使用==
运算符。
这是我的情况:
public static class A {
public final static A STATIC_FIELD = new A(prop1, prop2);
public A method(int param){
return (param > 0.5) ? STATIC_FIELD : new A(prop1, prop2);
}
}
现在,我可以将equals
替换为以下代码段中的==
,因为我指的是同一个对象,或者它是错的吗?
....
private bool method(){
A aInstance = getAInstance();
int param = Math.Random();
return aInstance.method(param).equals(A.STATIC_FIELD);
}
....
如果值STATIC_FIELD
取自enum
?
答案 0 :(得分:3)
这取决于你想做什么。
如果您需要检查这是否是完全相同的对象,请使用直接比较。如果您需要检查对象是否包含相同的内容(如字符串或数字),则应使用.equals。
这些方法的最常见错误似乎来自字符串比较,其中.equals如果字符串具有相同的内容则返回true但= =如果这是相同的字符串实例则返回true。
答案 1 :(得分:2)
你应该避免==(好吧,让我们同意你知道它:-)),也与单例实例有关,因为你可能会“忘记”以后它是通过单例创建的。但我会给你一个暗示。而不是:
if ((var != null) && (var.equals(A.STATIC_FIELD)))
你可以写:
if (A.STATIC_FIELD.equals(var))
就像许多人没有意识到要比较他们可能使用的字符串一样:
if ("static string".equals(varString))
您也可以使用java.util.Objects.equals来比较对象,而不会产生所有这些检查空值的负担。
答案 2 :(得分:0)
如果不覆盖equals()方法,equals()
和==
执行相同的操作,请检查引用的相等性。在这种情况下,您可以进行替换,因为当它为真时,method()将返回与A.STATIC_FIELD相同的引用。请参阅this answer。
答案 3 :(得分:0)
你不能使用==而不是equals()因为当我们在java中使用==时我们实际上在比较对象的内存地址,所以如果方法返回STATIC_FIELD那么它将作为一个静态对象正常工作地址在各处都一样。 但是当方法将返回A的新对象时,即使内容在类中相同,地址也不会匹配,因为新的A(param1,param2)坚持JVM在不同的内存位置创建新对象
答案 4 :(得分:0)
==
检查两个对象是否是同一个实例。如果要检查两个变量是否包含相同的实例(如果将变量分配给类常量,则可能就是这样),==
可以正常使用。如果您的变量恰好保留null
,它也不会出错,因此它比.equals()
具有更多优势。
enum
的实例始终是常量,并且两个不同的实例永远不会相等,因此==
也适用于那些实例。