Рубрики
Без рубрики

Сравнение длинных значений в Java

Узнайте, как сравнить длинные значения в Java.

Автор оригинала: Antonio Manuel Moreno Delgado.

1. Обзор

В этом коротком учебнике мы обсудим различные способы сравнения двух Длинные Экземпляров. Мы подчеркиваем проблемы, возникающие при использовании оператора сравнения ссылок ( и ).

2. Проблема с использованием справочного сравнения

Длинные является обертка класса для примитивного типа долго . Поскольку они являются объектами, а не примитивными ценностями, мы должны сравнить содержание Длинные экземпляры с .equals () вместо оператора эталонного сравнения (я)

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

Long l1 = 127L;
Long l2 = 127L;

assertThat(l1 == l2).isTrue();

но не с большими числами. Мы бы в конечном итоге возникли проблемы если значения находятся вне диапазона от -128 до 127, имея совершенно другой и неожиданный результат:

Long l1 = 128L;
Long l2 = 128L;

assertThat(l1 == l2).isFalse();

Это потому, Java поддерживает постоянный пул для экземпляров Длинные от -128 до 127 .

Эта оптимизация, однако, не дает нам лицензию на использование. В общем случае, два коробоные экземпляры имеющие одно и то же примитивное значение не дают одной и той же ссылки объекта.

3. Использование .equals ()

Одним из решений является использование .equals () . Это позволит оценить содержание (а не ссылка) обоих объектов:

Long l1 = 128L;
Long l2 = 128L;

assertThat(l1.equals(l2)).isTrue();

4. Объекты.равные ()

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

К счастью, есть нулевой -Безопасный метод утилиты, который мы можем использовать – Objects.equals () .

Давайте посмотрим, как это работает на практике:

Long l1 = null;
Long l2 = 128L;

assertThatCode(() -> Objects.equals(l1, l2)).doesNotThrowAnyException();

Как мы видим, нам не нужно беспокоиться, если какой-либо из Длинные s мы хотим сравнить это недействительный.

Под капотом, Objects.equals () сначала использует для сравнения, и если это не удается он использует стандартный равны ().

5. Распаковки длинных значений

5.1. Использование метода .longValue()

Далее, давайте использовать оператора сравнения “Я”, но безопасным способом. Классная Номер имеет метод .longValue() который разворачивает примитивные долго ценность:

Long l1 = 128L;
Long l2 = 128L;

assertThat(l1.longValue() == l2.longValue()).isTrue();

5.2. Кастинг к примитивным значениям

Другой способ распаковать Длинные по кастинг объектов примитивных типов. Таким образом, мы будем извлекать примитивное значение, а затем мы можем приступить к использованию оператора сравнения:

Long l1 = 128L;
Long l2 = 128L;

assertThat((long) l1 == (long) l2).isTrue();

Обратите внимание, для .longValue() метод или с помощью литья, мы должны проверить, если объект нулевой . У нас может быть NullPointerЭксцепция если объект нулевой .

6. Заключение

В этом коротком учебнике мы изучили различные варианты того, как Длинные Объектов. Мы проанализировали различия при сравнении ссылок на объекты или содержимое.

Как всегда, полный исходный код статьи доступен более на GitHub .