Подтвердить что ты не робот

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

Почему приведенный ниже код возвращает false для сравнения long3 == long2, хотя это и буквально.

public class Strings {

    public static void main(String[] args) {
        Long long1 = 256L + 256L;
        Long long2 = 512L;
        Long long3 = 512L;
        System.out.println(long3 == long2);
        System.out.println(long1.equals(long2));
    }
}
4b9b3361

Ответ 1

Long - это объект, а не примитив. Используя ==, вы сравниваете опорные значения.

Вам нужно сделать:

if(str.equals(str2))

Как и во втором сравнении.

Изменить: Я понял... вы думаете, что другие объекты действуют как литералы String. Они не *. И даже тогда вы никогда не захотите использовать == с литералами String.

(* Типы Autobox реализуют мухомодный паттерн, но только для значений -128 → 127. Если вы сделали свой Long равным 50, у вас действительно есть две ссылки на один и тот же самый мухомодный объект. И снова, никогда не используйте == для их сравнения.)

Изменить для добавления: Это указано в Спецификации языка Java, Раздел 5.1.7:

Если значение p в боксе равно true, false, байту или char в диапазоне от \u0000 до\u007f или int или коротком числе между -128 и 127 (включительно), тогда пусть r1 и r2 - результаты любых двух бокс-преобразований p. Всегда бывает, что r1 == r2.

Обратите внимание, что Long имеет значение не, но текущие реализации Oracle и OpenJDK делают это (1.6 и 1.7), что является еще одной причиной использования никогда T21 >

Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);

Выходы:

верно
ложь

Ответ 2

Если вы хотите сделать

      str3==str2

сделай вот так..

     str3.longValue()==str2.longValue()

Это служит вашей цели и намного быстрее, потому что вы сравниваете два значения примитивного типа, а не объекты.

Ответ 3

Вы также можете получить примитивное значение из объекта Long, используя:

str.longValue()