Java null 检查为什么使用 == 而不是 .equals()
在 Java 中,我被告知在进行 null 检查时应该使用 == 而不是 .equals()。其原因何在?
In Java I am told that when doing a null check one should use == instead of .equals(). What are the reasons for this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
它们是完全不同的两个东西。
==
比较变量包含的对象引用(如果有)。.equals()
根据两个对象对于相等含义的约定来检查它们是否相等。根据契约,两个不同的对象实例完全有可能“相等”。还有一个小细节,由于equals
是一个方法,如果您尝试在null
引用上调用它,您将得到一个NullPointerException
。例如:
They're two completely different things.
==
compares the object reference, if any, contained by a variable..equals()
checks to see if two objects are equal according to their contract for what equality means. It's entirely possible for two distinct object instances to be "equal" according to their contract. And then there's the minor detail that sinceequals
is a method, if you try to invoke it on anull
reference, you'll get aNullPointerException
.For instance:
除了已接受的答案(https://stackoverflow.com/a/4501084/6276704):
从 Java 1.7 开始,如果你想比较两个可能为空的对象,我推荐这个函数:
In addition to the accepted answer (https://stackoverflow.com/a/4501084/6276704):
Since Java 1.7, if you want to compare two Objects which might be null, I recommend this function:
如果你在
null
上调用.equals()
,你将得到NullPointerException
因此,在调用方法之前,无论它适用于什么地方,总是建议检查 nullity
<强>另请参阅
if you invoke
.equals()
onnull
you will getNullPointerException
So it is always advisble to check nullity before invoking method where ever it applies
Also See
在 Java 中,0 或 null 是简单类型,而不是对象。
equals() 方法不是为简单类型构建的。简单类型可以用==来匹配。
In Java 0 or null are simple types and not objects.
The method equals() is not built for simple types. Simple types can be matched with ==.
Object.equals 是 null 安全的,但请注意,如果两个对象为 null,object.equals 将返回 true,因此在使用 object.equals 之前,请务必检查要比较的对象是否不为 null(或持有 null 值)比较。
上面的示例片段将返回 equal!
Object.equals is null safe, however be aware that if two objects are null, object.equals will return true so be sure to check that the objects you are comparing aren't null (or hold null values) before using object.equals for comparison.
Example snippet above will return equal!
如果 foo 为空会发生什么?
你会得到一个 NullPointerException。
What happens if foo is null?
You get a NullPointerException.
如果一个 Object 变量为 null,则无法对其调用 equals() 方法,因此对 null 进行对象引用检查是正确的。
If an Object variable is null, one cannot call an equals() method upon it, thus an object reference check of null is proper.
如果尝试对空对象引用调用 equals,则会抛出空指针异常。
If you try calling equals on a null object reference, then you'll get a null pointer exception thrown.
根据 来源 使用什么并不重要对于默认方法实现:
但是您无法确定自定义类中的
equals
。According to sources it doesn't matter what to use for default method implementation:
But you can't be sure about
equals
in custom class.如果我们使用=> .equals 方法
当你的 obj 为 null 时,它会抛出 Null Point Exception。
所以我们应该使用 ==
来比较引用。
If we use=> .equals method
When your obj will be null it will throw Null Point Exception.
so we should use ==
it will compare the references.
这是一个示例,其中使用
org.json
时str != null
但str.equals(null)
编辑:
这是 org.json.JSONObject$Null班级:
here is an example where
str != null
butstr.equals(null)
when usingorg.json
EDIT:
here is the org.json.JSONObject$Null class:
因为 equal 是从 Object 类派生的函数,所以该函数比较该类的项。如果你将它与 null 一起使用,它将返回 false,因为类内容不为 null。另外 == 比较对对象的引用。
Because equal is a function derived from Object class, this function compares items of the class. if you use it with null it will return false cause cause class content is not null. In addition == compares reference to an object.
所以我永远不会感到困惑并避免使用此解决方案出现问题:
So I never get confused and avoid problems with this solution:
我昨晚就遇到过这个案例。
我简单地确定:
I have encountered this case last night.
I determine that simply that:
你的代码违反了德墨忒尔定律。这就是为什么最好重构设计本身。作为一种解决方法,您可以使用
上面的Optional来检查对象的层次结构,因此
如果您只有一个对象要检查,则
只需使用希望这会有所帮助!!!!
You code breaks Demeter's law. That's why it's better to refactor the design itself. As a workaround, you can use Optional
above is to check to hierarchy of a object so simply use
if you have only one object to check
Hope this helps !!!!
你总是可以这样做,
这将首先检查对象引用,然后检查对象本身,前提是引用不为空。
You could always do
This will first check the object reference and then check the object itself providing the reference isnt null.