Хобрук: Ваш путь к мастерству в программировании

Безопасность операторов сравнения с объектами Integer в Java

Когда безопасно использовать операторы сравнения, например. ==, >=, ‹ в Java при использовании объектов Integer, а не примитивных целых чисел?

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

Я знаю, что == опасно со ссылками, и вместо этого вы должны использовать .equals, но как насчет других операторов? например

int x = 7;
int y = 7;
Integer a = new Integer(7);
Integer b = new Integer(7);

System.out.println(x == y);
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(a <= b);

отпечатки

true
false // Why you should use .equals
true
true // Seemed dangerous but it worked?

Можно ли использовать что-либо, кроме двойного равенства (так что >, ‹, >= и ‹= безопасны?), или мне следует использовать метод .compareTo()?


Ответы:


1

Опасно, когда переменная ссылается на null. Действие распаковки вызовет ошибку NullPointerException.

Операторы <= и >= отличаются от ==. Их можно применять только к числовым примитивные типы (и значения), поэтому равенство ссылок не является проблемой.

30.10.2014

2
  • Если вы знаете, что значения не нулевые, то < > <= >= все в порядке, и они будут распакованы в int.
  • Вы, вероятно, никогда не захотите использовать == или !=, кроме как для проверки, является ли операнд нулевым. Они будут выполнять сравнение ссылок, а не значений, поэтому вместо этого вы, вероятно, захотите использовать метод equals.
  • Если есть вероятность, что одно из значений будет нулевым, то < > <= >= небезопасны - они могут дать NullPointerException.
30.10.2014

3

Операторы хорошо работают с примитивами. Методы (например, .equals() или .equalsIgnoreCase()) используются для объектов.

30.10.2014
  • Ничего. С .equalsIgnoreCase() я думал о String. Спасибо за улов. 31.10.2014
  • Новые материалы

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..