在Java中,我听说进行空值检查时应该使用==而不是.equals()。这是为什么呢?
==
比较变量所包含的对象引用(如果有的话)。.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
吗? - Jé QueueObject
中这是默认值。但是在许多JDK类中被覆盖。但是关键不在于实现,而在于语义。 (旁注:JDK7已经非常过时了。) - T.J. Crowdernull
不是一个对象,它是一个对象 引用(一个空的引用)。它是我们可以在代码中直接写出来的唯一对象引用。因此 Object a = null; Object b = null;
表示 a == b
为真,因为两个变量包含相同的对象引用(单一的全局空引用)。 - T.J. Crowder除了被接受的答案(https://dev59.com/FW855IYBdhLWcg3wKw9Y#4501084)之外:
从Java 1.7开始,如果你想比较两个可能为空的对象,我推荐使用这个函数:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
这个类包含用于操作对象的静态实用程序方法。这些实用程序方法包括在计算对象的哈希码、返回对象的字符串和比较两个对象时,能够处理空值或允许空值的方法。
自: 1.7
Object.equals()
而不是==
。 - kaushalpranav如果你在null
上调用.equals()
方法,你会得到一个NullPointerException
。
因此,在调用任何适用的方法之前,始终建议检查它们是否为null
。
if(str!=null && str.equals("hi")){
//str contains hi
}
还可以参见
if("hi".equals(str))
。 - ColinDsomeObject.equals(null)
会引发NullPointerException
异常,而不会进入equals方法。关键不在于equals方法是否包含空检查。 - Dave CostaObjects.equals(a, b)
。它不会引发空指针异常,但仍取决于“a”和“b”的“equal”方法。 - Dominik Minc在Java中,0或null是简单类型而不是对象。
equals()方法不适用于简单类型。简单类型可以用==进行匹配。
Object.equals是空指针安全的,但请注意,如果两个对象都为null,object.equals将返回true,因此请确保在使用object.equals进行比较之前检查您要比较的对象不为空(或者不包含null值)。
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
以上示例代码将返回相等!
Objects.equals()
的人来说应该是显而易见的。 - Guilherme Taffarel Bergaminfoo.equals(null)
如果foo为空会发生什么?
你会得到一个NullPointerException(空指针异常)。
如果一个对象变量为null,则无法调用equals()方法,因此应该对null进行对象引用检查。
public boolean equals(Object object) {
return this == object;
}
但是在自定义类中,你无法确定 equals
方法。
equals
只能返回false
或者引起NullPointerException
(如果覆盖的equals
方法是无意义的,则可能会返回其他内容)。 - Tom如果我们使用 .equals 方法
if(obj.equals(null))
// Which mean null.equals(null) when obj will be null.
if(obj == null)
它将比较这些引用。
如果你尝试在一个null对象引用上调用equals方法,那么你会得到一个空指针异常。
equals()
进行空值检查,试一试就会立即明显。 - Goran Jovic