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

在Java中,我被告知,当进行空检查时,应该使用==而不是.equals()。 这是什么原因?

他们是两个完全不同的东西。 ==比较variables包含的对象引用(如果有的话)。 .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 

如果你在null上调用.equals() ,你将得到NullPointerException

所以总是build议在调用方法之前检查无效性

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

另见

  • 在Java中的差异等于和==

在Java中,0或null是简单types而不是对象。

equals()方法不是为简单types构build的。 简单的types可以匹配==。

 foo.equals(null) 

如果foo为空,会发生什么?

你得到一个NullPointerException。

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

如果您尝试在空对象引用上调用equals,那么您将得到抛出的空指针exception。

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

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

但是你不能确定自定义课程中的equals

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

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

当你的obj将为空时,它将抛出空点exception。

所以我们应该使用==

 if(obj == null) 

它会比较参考。

除了接受的答案( https://stackoverflow.com/a/4501084/6276704 ):

自从Java 1.7我会推荐使用

 Objects.equals(onePossibleNull, twoPossibleNull) 

比较两个可能为空的对象。

java.util.Objects

这个类包含了对对象进行操作的静态工具方法。 这些实用程序包括用于计算对象的哈希码,为对象返回string以及比较两个对象的空安全或空容忍方法。

由于:1.7

因为equal是从Object类派生的函数,所以此函数比较类的项目。 如果使用null,则会返回false,导致类内容不为null。 另外==比较对象的引用。

这里是一个例子,当使用org.jsonstr != nullstr.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 

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

所以我永远不会感到困惑,并避免这个解决scheme的问题:

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

你可以随时做

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

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