web-dev-qa-db-ja.com

Java null .equals()の代わりに==を使用する理由をチェック

Javaでは、nullチェックを行うとき、.equals()の代わりに==を使用する必要があると言われています。この理由は何ですか?

107
Jim Jeffries

それらは2つのまったく異なるものです。 ==は、変数に含まれるオブジェクト参照(存在する場合)を比較します。 .equals()は、2つのオブジェクトがequalであるかどうかをチェックします。これらのオブジェクトは、等式の意味についての契約に従います。 2つの異なるオブジェクトインスタンスが、契約に従って「等しい」ことは完全に可能です。そして、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
163
T.J. Crowder

null.equals()を呼び出すと、NullPointerExceptionが取得されます

そのため、適用される場合は常にメソッドを呼び出す前にnullityをチェックすることをお勧めします

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

参照

33
Jigar Joshi

Javaでは、0またはnullは単純型であり、オブジェクトではありません。

メソッドequals()は、単純型用に構築されていません。単純型は==と一致させることができます。

17
user523859

受け入れられた答えに加えて( https://stackoverflow.com/a/4501084/6276704 ):

Java 1.7以降、nullの可能性がある2つのオブジェクトを比較する場合、この関数をお勧めします。

Objects.equals(onePossibleNull, twoPossibleNull)

Java.util.Objects

このクラスは、オブジェクトを操作するための静的ユーティリティメソッドで構成されます。これらのユーティリティには、オブジェクトのハッシュコードを計算し、オブジェクトの文字列を返し、2つのオブジェクトを比較するためのnullセーフまたはnull許容メソッドが含まれています。

から:1.7

16
BluE
foo.equals(null)

Fooがnullの場合はどうなりますか?

NullPointerExceptionが発生します。

3
Nick Orton

Object変数がnullの場合、equals()メソッドを呼び出すことができないため、nullのオブジェクト参照チェックが適切です。

2
Jé Queue

Nullオブジェクト参照でequalsを呼び出そうとすると、nullポインター例外がスローされます。

2
A_M

=> .equalsメソッドを使用する場合

if(obj.equals(null))  

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

Objがnullになると、Null Point Exceptionがスローされます。

==を使用する必要があります

if(obj == null)

参照を比較します。

2
AKT

sources によると、デフォルトのメソッド実装に何を使用してもかまいません。

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

ただし、カスタムクラスのequalsについて確認することはできません。

2
DixonD

EqualはObjectクラスから派生した関数であるため、この関数はクラスのアイテムを比較します。 nullで使用すると、クラスのコンテンツがnullではないため、falseを返します。さらに、==はオブジェクトへの参照を比較します。

1
danny.lesnik

以下は、str != nullを使用するときにorg.jsonstr.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




EDIT:ここに 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;
    }  
}
1
dina

だから私は決して混乱しないし、このソリューションの問題を回避します:

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

昨夜この事件に遭遇しました。
単純に次のことを決定します。

存在しないequals()method for null
したがって、invokeが存在しない場合、存在しないメソッドはできません。
->>>これが==を使用してnullをチェックする理由です。

0
Neo_