Сравните две примитивные длинные переменные в Java - PullRequest
8 голосов
/ 13 марта 2012

Название довольно очевидно. Я перехожу с C # на Java. У меня есть объект и метод получения, который возвращает его идентификатор. Я хочу сравнить идентификаторы двух объектов одного типа и проверить, равны ли значения их идентификаторов.

пробовал:

obj.getId() == obj1.getId();

Long id1 = obj.getId();
Long id2 = obj1.getId();

assertTrue(id1.equals(id2))

assertTrue(id1== id2)

Ответы [ 7 ]

22 голосов
/ 13 марта 2012

В Яве:

  • оператор == сообщает вам, являются ли два операнда одинаковым объектом (экземпляром).
  • метод .equals() в Long сообщает вам, равны ли они по значению .

Но вы не должны этого делать. Правильный способ сделать это так:

assertEquals(id1, id2);

При assertEquals(), если утверждение не выполнено, в сообщении об ошибке будет указано, какие были два значения, например, expected 2, but was 5 и т. Д.

2 голосов
/ 14 марта 2012

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

Возвращает ли getID () что-то типа Long (это тип класса) или типа long (это примитивный тип)? Проблема заключается в том, что если метод возвращает значение примитива, то сравнение с '==' и 'equals ()' сработает, потому что Java автоматически преобразует примитивы в объекты-оболочки, когда они вам нужны.

Но, с другой стороны, если getID () возвращает значение Long, сравнение с '==', скорее всего, не удастся, потому что это проверяет, есть ли у вас один и тот же объект, а не если объекты имеют одинаковое значение.

2 голосов
/ 13 марта 2012

Они не должны быть равны, используя ==. Используйте либо:

id1.equals(id2)

или

id1.longValue() == id2.longValue()

В обоих случаях я пропустил нулевые проверки, потому что я сомневаюсь, что вы забудете их, если бы они были необходимы здесь;)

Итак, почему Long не всегда == другой Long с тем же значением? Ответ прост. Это разные объекты! В зависимости от как Long был получен, они могут быть одинаковыми из-за внутреннего кэширования. См. Long.valueOf .

2 голосов
/ 13 марта 2012

Попробуйте сделать следующее:

assertTrue(id1.longValue() == id2.longValue())
1 голос
/ 13 марта 2012

в java,

используйте == для сравнения примитивов и x.equals(y) для сравнения объектов.

Я не уверен, что ваш вопрос - похоже, вы пробовали обаи не сработало?

Обратите внимание, вы используете Long вместо long, поэтому вы хотите использовать .equals()

(long - примитив, Long это объект)

1 голос
/ 13 марта 2012

Вам необходимо знать разницу между Long и long - long - это тип примитива, Long - это тип оболочки. (Немного похоже на коробочное значение в C #, но строго типизировано.) Какой тип возвращаемого значения getId()?

Просто:

assertEqual(id1, id2);

должно быть хорошо, если вы делаете это в тесте. В противном случае вы можете использовать:

if (id1.equals(ids2))

если они определенно не ноль, или используйте Гуава :

if (Objects.equal(id1, id2))

для обработки недействительности. (Конечно, вы можете написать Objects.equal самостоятельно, но в любом случае вы обязательно должны овладеть Гуавой , так что вы можете использовать это ...)

Стоит отметить, что некоторые объекты-обертки используются повторно, например:

// This will work
Long x = 5L;
Long y = 5L;
assertTrue(x == y); // Reference comparison

// This *probably* won't but it could!
x = 10000L;
y = 10000L;
assertTrue(x == y); // Reference comparison
0 голосов
/ 06 апреля 2018

Для сравнения двух примитивных long используйте Long.compare (long x, long y).Этот метод был добавлен в Java 1.7.Ниже приведена реализация метода:

public static int compare(long x, long y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

Пример:

long x = 1L;
long y = 1L;
if (Long.compare(x,y) == 1) {
  System.out.println(values of x and y are same);
}
...