在Java中,我被告知在执行null检查时应使用==而不是.equals()。是什么原因呢?
在Java中,我被告知在执行null检查时应使用==而不是.equals()。是什么原因呢?
Answers:
他们是两个完全不同的东西。==
比较变量包含的对象引用(如果有)。根据相等性的含义.equals()
检查两个对象是否相等。根据它们的契约,两个不同的对象实例完全有可能“相等”。还有一个小细节,因为这equals
是一个方法,所以如果您尝试在引用上调用它null
,则会得到一个NullPointerException
。
例如:
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null
public int data
?
Object
,是的。但是,它被大量的JDK类覆盖。但是,重点不是实现,而是语义。(旁注:JDK7已经过时。)
如果您调用.equals()
,null
您将获得NullPointerException
因此,始终建议在适用的地方调用方法之前检查无效性
if(str!=null && str.equals("hi")){
//str contains hi
}
另请参阅
if ("hi".equals(str))
。
someObject.equals(null)
将引发a,NullPointerException
而无需输入equals方法。
Objects.equals(a, b)
它不会引发NullPointerException,但是它仍然取决于“ a”和“ b”的“相等”方法
除了接受的答案(https://stackoverflow.com/a/4501084/6276704):
从Java 1.7开始,如果要比较两个可能为null的对象,我建议使用此函数:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
此类包含用于对对象进行操作的静态实用程序方法。这些实用程序包括用于计算对象的哈希码,返回对象的字符串以及比较两个对象的null安全或null容忍方法。
从:1.7
在Java中,0或null是简单类型,而不是对象。
equals()方法不是为简单类型构建的。简单类型可以与==匹配。
Object.equals是null安全的,但是请注意,如果两个对象为null,则object.equals将返回true,因此在将object.equals用于比较。
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
上面的示例代码片段将返回等于!
这是一个例子,str != null
但是str.equals(null)
当使用org.json
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
编辑:
这是org.json.JSONObject $ Null类:
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
private static final class Null {
/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/
@Override
public boolean equals(Object object) {
return object == null || object == this;
}
}
field.equals(null)
返回true。这破坏了常规的Java行为,因此令人困惑。field.equals("null")
至少在我看来,它仅适用于。我不知道为什么库开发人员会认为这会很好地支持。
str != null
并 str.equals(null)
返回的示例”?true
jsonObject
包含“字段”键,这就是为什么field
它不为null 的原因,它有一个包含json.org.JSONObject$Null
对象的引用
Null
喜欢null
并会使用"null"
来代替。但是我想他们这样做是为了避免使用字符串。但是即使有了这个lib,field.equals(null)
仍然几乎总是一个问题:P。
你总是可以做
if (str == null || str.equals(null))
这将首先检查对象引用,然后在引用不为null的情况下检查对象本身。
x.equals(null)
。
equals()
并查看。当您尝试尝试时,它将立即变得很明显