Проверка на ноль Java, почему используйте == вместо .equals () - PullRequest
107 голосов
/ 21 декабря 2010

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

Ответы [ 13 ]

164 голосов
/ 21 декабря 2010

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

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

Так что всегда желательно проверять недействительность перед вызовом метода, где бы он ни применялся

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

См. Также

17 голосов
/ 21 декабря 2010

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

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

16 голосов
/ 28 июня 2017

В дополнение к принятому ответу (https://stackoverflow.com/a/4501084/6276704):

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

Objects.equals(onePossibleNull, twoPossibleNull)

java.util.Objects

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

С: 1,7

3 голосов
/ 21 декабря 2010
foo.equals(null)

Что произойдет, если foo равно нулю?

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

2 голосов
/ 02 февраля 2016

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

if(obj.equals(null))  

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

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

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

if(obj == null)

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

2 голосов
/ 21 декабря 2010

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

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

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

2 голосов
/ 21 декабря 2010

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

2 голосов
/ 21 декабря 2010

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

1 голос
/ 10 декабря 2016

вот пример, где 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'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;
    }  
}
...