标题非常明显。我正在从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)
答案 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)
您需要了解Long
和long
之间的区别 - 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);
}