Javanull 检查为什么使用 = = 而不是. equals()

在 Java 中,我被告知在执行 null 检查时应该使用 = = 而不是。等于()。这样做的原因是什么?

383962 次浏览

如果在 null上调用 .equals(),就会得到 NullPointerException

因此,在应用方法的任何地方调用方法之前,总是建议检查 null

if(str!=null && str.equals("hi")){
//str contains hi
}

也请参见

如果 Object 变量为 null,则不能对其调用 equals ()方法,因此对象引用检查 null 是正确的。

foo.equals(null)

如果 foo 为 null 会发生什么?

得到一个 NullPointerException。

这完全是两码事。==比较变量包含的对象引用(如果有的话)。根据两个对象的约定,.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

如果尝试在空对象引用上调用 equals,那么将抛出一个空指针异常。

因为 equals 是从 Object 类派生的函数,所以该函数比较该类的项。如果与 null 一起使用,它将返回 false,因为类内容不为 null。此外 = = 比较对对象的引用。

根据 消息来源,默认方法实现使用什么并不重要:

public boolean equals(Object object) {
return this == object;
}

但是你不能肯定 equals在定制类。

在 Java0或 null 中是简单的类型,而不是对象。

方法 equals ()不是为简单类型构建的。简单类型可以与 = = 匹配。

你随时都可以

if (str == null || str.equals(null))

这将首先检查对象引用,然后检查提供引用 isnnull 的对象本身。

如果我们使用 = > . equals 方法

if(obj.equals(null))


// Which mean null.equals(null) when obj will be null.

当 obj 为 Null 时,它将抛出 Null Point Exception。

所以我们应该用 = =

if(obj == null)

它会比较参考文献。

这里有一个例子,当使用 org.json时,str != null但是 str.equals(null)

 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




编辑: 这是 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;
}
}

除了公认的答案(https://stackoverflow.com/a/4501084/6276704)外:

从 Java 1.7开始,如果你想比较两个可能为 null 的对象,我推荐这个函数:

Objects.equals(onePossibleNull, twoPossibleNull)

对象

此类由静态实用工具方法组成,用于在 这些实用程序包括空安全或空容忍方法 用于计算对象的哈希代码,返回 对象,并比较两个对象。

自从: 1.7

因此,我从来不会对这个解决方案感到困惑和避免问题:

if(str.trim().length() <=0 ) {
// is null !
}

我昨晚遇到了这个案子。
我的决定很简单:

对于 < strong > null 不存在 等于()方法
因此,如果没有 调用方法,就不可能有一个不存在的方法
这就是为什么我们使用 ==来检查 无效的原因

Equals 是 null 安全的,但是要注意,如果两个对象都是 null,Object.equals 将返回 true,所以在使用 Object.equals 进行比较之前,一定要检查正在比较的对象是否为 null (或保持为 null 值)。

String firstname = null;
String lastname = null;


if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}

上面的示例代码片段将返回相等的结果!

你的密码违反了得墨忒耳定律。这就是为什么重构设计本身更好。作为解决方案,您可以使用可选项

   obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")

上面是检查对象的层次结构,因此简单地使用

Optional.ofNullable(object1)

如果您只有一个对象要检查

希望这个能帮上忙!