比较java中的两个原始长变量

时间:2012-03-13 19:47:47

标签: java compare long-integer

标题非常明显。我正在从C#转向Java。我有一个对象和一个返回其ID的getter方法。我想比较两个相同类型的对象的id,并检查它们的id值是否相等。

尝试:

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

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

assertTrue(id1.equals(id2))

assertTrue(id1== id2)

7 个答案:

答案 0 :(得分:22)

在java中:

  • ==运算符告诉您两个操作数是否是相同的对象(实例)。
  • .equals()上的Long方法会告诉您值是否等于

但你不应该这样做。正确的方法是:

assertEquals(id1, id2);

使用assertEquals(),如果断言失败,错误消息将告诉您这两个值是什么,例如expected 2, but was 5

答案 1 :(得分:2)

尝试执行以下操作:

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

答案 2 :(得分:2)

使用==它们不能相等。使用:

id1.equals(id2)

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

在这两种情况下,我都遗漏了无效检查,因为我怀疑你会忘记它们,如果它们在这里需要的话;)

那么,为什么Long不总是==另一个具有相同值的Long?答案很简单。他们是不同的对象!由于内部缓存,根据如何检索Long,它们可能是相同的。请参阅Long.valueOf

答案 3 :(得分:2)

除了有关正确比较的所有评论之外,强类型还可以帮助您解决问题。

getID()是否返回Long类型(类型)或long类型(这是基本类型)?问题是如果方法返回原始值,那么与'=='和'equals()'进行比较都会起作用,因为Java会在您需要时自动将基元转换为包装器对象。

但另一方面,如果getID()返回Long值,则与'=='比较可能会失败,因为它会检查您是否具有相同的对象,而不是对象具有相同的值。

答案 4 :(得分:1)

您需要了解Longlong之间的区别 - long是基本类型,Long是包装类型。 (有点像C#中的盒装值,但强类型。)getId()的返回类型是什么?

简单地:

assertEqual(id1, id2);
如果你在测试中这样做,

应该没问题。否则,您可以使用:

if (id1.equals(ids2))

如果他们肯定 null,或使用Guava

if (Objects.equal(id1, id2))

处理无效。 (当然,你可以自己编写Objects.equal,但你绝对应该掌握Guava ,所以你不妨使用它......)

值得注意的是,某些包装器对象会被重用 - 例如:

// 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

答案 5 :(得分:1)

在java中,

使用==比较基元和x.equals(y)来比较对象。

我不确定你的问题是什么 - 看起来你们两个都试过了,但都没有用?

注意,您使用的是Long而不是long,因此您要使用.equals()

long是基元,Long是对象)

答案 6 :(得分:0)

比较两个原始的长期使用Long.compare(长x,长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);
}