Java null проверить, почему use == вместо .equals()

В Java мне сказали, что при выполнении нулевой проверки следует использовать == вместо .equals(). Каковы причины этого?

Ответ 1

Это две совершенно разные вещи. == сравнивает ссылку на объект, если таковая имеется, содержащуюся в переменной. .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

Ответ 2

если вы вызываете .equals() на null, вы получите NullPointerException

Поэтому всегда рекомендуется проверять значение nullity перед вызовом метода, когда он применяется.

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

Также см.

Ответ 3

В дополнение к принятому ответу (fooobar.com/questions/70455/...):

Начиная с Java 1.7, если вы хотите сравнить два объекта, которые могут быть нулевыми, я рекомендую эту функцию:

Objects.equals(onePossibleNull, twoPossibleNull)

java.util.Objects

Этот класс состоит из статических служебных методов для работы с объекты. Эти утилиты включают нуль-безопасные или нуль-толерантные методы для вычисления хеш-кода объекта, возвращая строку для объект и сравнение двух объектов.

Since: 1.7

Ответ 4

В Java 0 или null есть простые типы, а не объекты.

Метод equals() не построен для простых типов. Простые типы могут быть сопоставлены с ==.

Ответ 5

foo.equals(null)

Что произойдет, если foo null?

Вы получаете исключение NullPointerException.

Ответ 6

Если переменная Object имеет значение NULL, на нее нельзя вызвать метод equals(), поэтому правильная проверка ссылки на объект null.

Ответ 7

Если вы попробуете называть равным ссылку на нулевой объект, тогда вы получите исключение с нулевым указателем.

Ответ 8

В соответствии с источниками не имеет значения, что использовать для реализации метода по умолчанию:

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

Но вы не можете быть уверены в equals в пользовательском классе.

Ответ 9

Если мы используем метод = > .equals

if(obj.equals(null))  

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

Когда ваш объект будет пустым, он выкинет исключение Null Point.

поэтому мы должны использовать ==

if(obj == null)

он будет сравнивать ссылки.

Ответ 10

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!");
}

Пример приведенного выше фрагмента вернется равным!

Ответ 11

Поскольку equal - это функция, полученная из класса Object, эта функция сравнивает элементы класса. если вы используете его с нулевым значением, он вернет ложную причину, потому что класс класса класса не равен нулю. Кроме того, == сравнивает ссылку на объект.

Ответ 12

Вот пример, где 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




EDIT: вот класс org.json.JSONObject $ Null :

/**
 * JSONObject.NULL is equivalent to the value that JavaScript calls null,
 * whilst Java 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;
    }  
}

Ответ 13

Поэтому я никогда не смущаюсь и избегаю проблем с этим решением:

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

Ответ 14

Я столкнулся с этим случаем прошлой ночью.
Я просто определяю, что:

Не существует метод equals() для null
 Таким образом, вы не можете вызвать несуществующий метод, если у вас нет
- >>> Вот почему мы используем == для проверки на ноль

Ответ 15

Вы всегда можете сделать

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

Это сначала проверит ссылку на объект, а затем проверит сам объект, предоставив ссылку isnt null.