Java null проверить, почему use == вместо .equals ()
В Java мне сказали, что при выполнении нулевой проверки следует использовать == вместо .equals (). В чем причины этого?
- Java «?» Оператор для проверки null - что это такое? (Не трогательно!)
- ListView getChildAt возвращает null для видимых детей
- Почему нулевой литой?
- Почему .ToString () в нулевой строке вызывает нулевую ошибку, когда .ToString () отлично работает в nullable int с нулевым значением?
- Что более эффективно: if (null == variable) или if (variable == null)?
- Почему при вызове (статического) метода в нулевой ссылке не выбрасывается исключение NullPointerException?
- getActionView () моего MenuItem возвращает null
- Нужно ли проверять нуль перед вызовом instanceof?
Это две совершенно разные вещи. ==
сравнивает ссылку на объект, если таковая имеется, содержащуюся в переменной. .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()
на null
вы получите NullPointerException
Поэтому всегда рекомендуется проверять значение nullity перед вызовом метода, когда он применяется
if(str!=null && str.equals("hi")){ //str contains hi }
Также см
- разница между равными – и == в Java
В Java 0 или null есть простые типы, а не объекты.
Метод equals () не построен для простых типов. Простые типы могут быть сопоставлены с ==.
В дополнение к принятому ответу ( https://stackoverflow.com/a/4501084/6276704 ):
Начиная с Java 1.7, если вы хотите сравнить два объекта, которые могут быть пустыми, я рекомендую эту функцию:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
Этот class состоит из статических методов утилиты для работы с объектами. Эти утилиты include в себя нулевые или нулеустойчивые методы для вычисления хеш-кода объекта, возврата строки для объекта и сравнения двух объектов.
С: 1.7
foo.equals(null)
Что произойдет, если foo имеет значение NULL?
Вы получаете исключение NullPointerException.
Если переменная Object имеет значение null, нельзя называть метод equals () на ней, поэтому проверка ссылки на объект null является правильной.
Если вы попробуете называть равным ссылку на нулевой объект, тогда вы получите исключение исключений нулевого указателя.
Согласно источникам, не имеет значения, что использовать для реализации метода по умолчанию:
public boolean equals(Object object) { return this == object; }
Но вы не можете быть уверены в equals
в пользовательском classе.
Если мы используем метод => .equals
if(obj.equals(null)) // Which mean null.equals(null) when obj will be null.
Когда ваш объект будет пустым, он выкинет Null Point Exception.
поэтому мы должны использовать ==
if(obj == null)
он будет сравнивать ссылки.
Поскольку equal – это функция, полученная из classа Object, эта функция сравнивает элементы classа. если вы используете его с нулевым значением, он вернет ложную причину, потому что class classа classа не равен нулю. Кроме того, == сравнивает ссылку на объект.
вот пример, где 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: вот class 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; } }
Поэтому я никогда не смущаюсь и избегаю проблем с этим решением:
if(str.trim().length() <=0 ) { // is null ! }
Вы всегда можете сделать
if (str == null || str.equals(null))
Это сначала проверит ссылку на объект, а затем проверит сам объект, предоставив ссылку isnt null.