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

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

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

  • Доступ к членам classа по указателю NULL
  • Как проверить, равна ли моя строка нулевой?
  • Когда был NULL макрос не 0?
  • h: inputText, привязанный к свойству String, представляет пустую строку вместо null
  • Мое текущее местоположение всегда возвращает null. Как я могу это исправить?
  • Как упростить реализацию null-safe compareTo ()?
  • Hibernate: Как установить значение параметра NULL-запроса в HQL?
  • MySQL: выбор строк, где столбец равен нулю
  • Должен ли метод поиска возвращать 'null' или вызывать исключение, если он не может получить возвращаемое значение?
  • Что такое исключение NullReferenceException и как его исправить?
  • Что является предпочтительным: Nullable . HasValue или Nullable ! = Null?
  • Interesting Posts

    Windows: переместите программы (с записями реестра) на другой жесткий диск

    Как я могу получить количество строк текстового файла?

    Открыть PDF-файл «на лету» из приложения Java

    Выбрасывать каждый четный или нечетный кадры с помощью FFmpeg?

    Использование специального сервлета автоматического запуска для инициализации при запуске и совместного использования данных приложения

    WPF DataGrid CustomSort для каждого столбца

    Весенняя загрузка с помощью AngularJS html5Mode

    Ограничить количество строк для UITextview

    Android Studio – установка JVM не найдена

    java.sql.SQLException: Неверное строковое значение: ‘\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F …’

    преобразовать маленький файл Endian в большой Endian

    Google Spreadsheet SCRIPT Проверьте, не отредактирована ли отредактированная ячейка в определенном диапазоне

    Существуют ли инструменты для обрезки полей PDF?

    Почему мне нужно вручную установить кадр моего представления в viewDidLoad?

    Как я могу вернуть NULL из общего метода в C #?

    Давайте будем гением компьютера.