kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Venzentx
Venzentx
Вопрос

оператор равенства, странные результаты?

У меня есть вопрос по поводу следующего фрагмента кода:

public class Equivalence {
    public static void main(String[] args) {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
    }
}

Полученный результат меня удивил:

false
true

Я проверил конструктор в Javadoc онлайн, ничего не помогло.

Заранее спасибо

Спасибо

1 2012-11-03T20:19:50+00:00 3
Filip  Roséen - refp
Filip Roséen - refp
Редактировал вопрос 3-го ноября 2012 в 8:38
Программирование
java
Этот вопрос имеет 1 ответ на английском, чтобы прочитать их войдите в свой аккаунт.
Amit Deshpande
Amit Deshpande
3-го ноября 2012 в 8:20
2012-11-03T20:20:52+00:00
Дополнительно
Источник
Редактировать
#17633493

Для проверки равенства значений следует использовать equals. Потому что Integer - это класс-обертка, который оборачивает значение int. == проверяет равенство на основе ссылки, поэтому в обоих случаях ваша ссылка будет разной.

Сравнивает данный объект с указанным объектом. Результат будет истинным тогда и только тогда, когда аргумент не является null и представляет собой объект Integer, который содержит то же значение int, что и данный объект.

 n1.equals(n2);

Если вы выполните

int n1 = new Integer(47);
int n2 = new Integer(47);

Вы получите ожидаемый результат.

Поскольку Java поддерживает пул целых чисел от 127 до -128, вы также можете сделать следующее

 Integer n1 = Integer.valueOf(47);
 Integer n2 = Integer.valueOf(47);<-- will return you the same reference
     n1==n2 >>> True
Amit Deshpande
Amit Deshpande
Редактировал ответ 3-го ноября 2012 в 8:33
4
0
Решение / Ответ
 biziclop
biziclop
3-го ноября 2012 в 8:23
2012-11-03T20:23:21+00:00
Дополнительно
Источник
Редактировать
#17633494

С помощью == можно надежно сравнивать только примитивные типы. Для объектов (а Integer является объектным типом) следует использовать метод equals().

== можно использовать для объектов, но только для проверки того, являются ли два объекта одинаковыми. Например:

Integer n1 = new Integer(47);
Integer n2 = n1;
// n1 == n2 will be true

Лучше всего воспринимать int как само число, а Integer как записку с написанным на ней числом. == вернет истину, только если вы говорите об одной и той же записке, а equals() вернет истину для любых двух записок с одинаковыми числами.

Проблема усложняется тем, что начиная с версии 1.5 в Java появилась функция autoboxing, то есть int автоматически преобразуется в Integer и наоборот, когда это необходимо. Это может привести к очень неожиданным результатам, если вы не будете осторожны.

 biziclop
biziclop
Редактировал ответ 3-го ноября 2012 в 8:29
3
0
Yogendra Singh
Yogendra Singh
3-го ноября 2012 в 8:23
2012-11-03T20:23:44+00:00
Дополнительно
Источник
Редактировать
#17633495

n1 == n2, сравнивает экземпляры объектов и поэтому n1 == n2 вернет false, а n1 != n2 вернет true, так как n1 и n2 не одинаковые экземпляры объектов..

Если вы используете метод equals или получите значение int (primitive tpye), а затем сравните с помощью == или !=, вы получите правильные результаты, например.

    System.out.println(n1.equals(n2)); //true
    System.out.println(!n1.equals(n2));//false

или

    System.out.println(n1.intValue() == n2.intValue()); //true
    System.out.println(n1.intValue() != n2.intValue()); //false
Yogendra Singh
Yogendra Singh
Редактировал ответ 3-го ноября 2012 в 8:35
1
0
Похожие сообщества 11
pro.jvm
pro.jvm
5 814 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 375 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 434 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
pro.JVM Jobs Chat
pro.JVM Jobs Chat
2 564 пользователей
Чат для обсуждения вакансий на JVM языках. Правила: - Никакого спама - Никакого троллинга и оскорблений участников - Размещение вакансий только через канал Канал для вакансий: @jvmjobs Основной чат: @jvmchat Наши друзья: @scala_jobs, @scala_jobs_feed
Открыть telegram
Java/Kotlin and more
Java/Kotlin and more
2 063 пользователей
чат о Java/Kotlin и связанных технологиях. We're discussing: job, tech questions etc. languages: russian, java, eng, kotlin Ссылка на чат: t.me/springframeworkio
Открыть telegram
Java Underground
Java Underground
1 751 пользователей
Библиотека по Java https://t.me/javalib Наше сообщество ВК: https://vk.com/javatutorial Вакансии и резюме свои строго в этот канал: https://t.me/job_java
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией