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

Java空检查为什么使用==而不是.equals(),java,null,Java,Null,在Java中,我被告知在执行空检查时应该使用==而不是.equals()。原因是什么?如果在null上调用.equals(),您将得到NullPointerException 所以,在调用方法之前检查空值总是可取的,不管它在哪里应用 if(str!=null && str.equals("hi")){ //str contains hi } 另请参见 如果对象变量为null,则不能对其调用equals()方法,因此对象引用检查null是正确的 foo.equals(n

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

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

所以,在调用方法之前检查空值总是可取的,不管它在哪里应用

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


如果对象变量为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,则会引发空指针异常。

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

根据默认方法实现使用什么并不重要:

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

但是您不能确定自定义类中的
是否等于

在Java 0中或null是简单的类型,而不是对象

equals()方法不是为简单类型生成的。简单类型可以匹配==。

您总是可以这样做的

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

这将首先检查对象引用,然后检查对象本身,前提是引用不为null。

如果使用=>.equals方法

if(obj.equals(null))  

// Which mean null.equals(null) when obj will be null.
当您的obj为空时,它将抛出空点异常

所以我们应该使用==

if(obj == null)

它将比较引用。

下面是一个示例,其中
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



编辑: 下面是课堂:


除了公认的答案():

由于Java 1.7,如果要比较两个可能为空的对象,我建议使用以下函数:

Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects

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

自: 1.7


因此,我从不感到困惑,并避免使用此解决方案时出现问题:

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

if(str.trim().length()我昨晚遇到了这个案子。

我只确定:

null的equals()方法不存在
因此,如果您没有
调用
一个不存在的方法
-->>>这就是为什么我们使用=检查null


Object.equals是空安全的,但是请注意,如果两个对象为空,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!");
}

上面的示例片段将返回相等的值!

您的代码违反了德米特定律。这就是为什么最好重构设计本身。作为一种解决方法,您可以使用可选的

   obj = Optional.ofNullable(object1)
    .map(o -> o.getIdObject11())
    .map(o -> o.getIdObject111())
    .map(o -> o.getDescription())
    .orElse("")
上面是检查对象的层次结构,所以只需使用

Optional.ofNullable(object1) 
如果只有一个对象要检查


希望这会有所帮助!!

最简单的方法是尝试使用
equals()
进行空值检查,然后查看。当您尝试时,会立即看到明显的结果。顺便说一句,使用关键字“java空值检查”(不带引号)的谷歌搜索给我一个最热门的答案,它的信息与这里的答案相同。你的例子通常更好地写成
if(“hi”.equals(str))
@user368186:问题不在于equals方法是否包含null检查。如果你的对象引用为null,那么调用
someObject.equals(null)
将引发一个
NullPointerException
而无需输入equals方法。@ColinD Agree在此处演示始终建议不惜一切代价避免null,因此您根本不需要null检查;)。您可以始终使用
对象。equals(a,b)
它不会引发NullPointerException,但它仍然依赖于“equal”“a”和“b”的方法是否意味着
公共int数据
?@Xepoch:不,我通常不创建公共字段(尽管这两种方法对本例都不重要)。为什么?@T.J.克劳德“他们是两个完全不同的东西……”一般来说是的。但是,如果我的理解是正确的,那么两者的默认实现是相同的。查看源代码,.equals()基本上执行==检查@Ayush-这是
对象中的默认值,是的。不过,它被大量JDK类覆盖。但重点不是实现,而是语义。(旁注:JDK7已经过时了。)@RogerWang-问得好!答案是
null
不是一个对象,它是一个对象引用(一个空白引用)。这是我们可以在代码中直接编写的唯一对象引用。所以
对象a=null;对象b=null
表示
a==b
为真,因为两个变量都包含相同的对象引用(单个通用的空白引用)。向上投票选择最有用的实际答案,而不是明显的“NullPointerException将返回”herp derp answer.if(str==null | | str.equals(null)| | str equals(“”)我使用了你的答案并添加了一个空字符串的检查!如果我没弄错的话,null和“”不是一回事。它不是完全重新编译吗
Optional.ofNullable(object1)