我不知道为什么这种情况永远不会得到满足: 我正在比较两个ArrayList值,它总是错误的。
if ( (Integer) results.get(rank) == (Integer) experts.get(j))
我正在调试,我有完全相同的2个值:3043和3043 但它不起作用。
感谢
答案 0 :(得分:8)
使用equals()
,而不是==
。这是两个不同的对象,代表相同的值。所以它们不是==
(不同的对象),而是equals()
(相同的内容)。
答案 1 :(得分:3)
正如Uri所说,你需要使用方法.equals()代替==。
==运算符只会检查返回的引用 results.get(rank)和experts.get(j)指向同一个对象(在这种情况下,它们在技术上不会)
有两种方法可以解决这个问题。 1)如果您知道专家将始终包含参考的事实,请执行以下操作: experts.get(J).equals(results.get(评级))
2)如果您完全确定双方都会参考,请执行以下操作: ((整数)results.get(rank))。intValue()==((Integer)experts.get(j))。intValue()
享受
答案 2 :(得分:1)
==只会对基元进行值比较。
每当处理Object类型,包括大盘Integer,Long等,你需要等于,而不是==
答案 3 :(得分:1)
==
运算符检查两个Object
引用相同,而不是我们通常认为的相等。这意味着对于Integer
类型,它会检查它们是否引用相同的Integer
。如果代码中的某个位置有2行创建值为{30}的新Integer
,而不是重用一个实例,则它们不是指内存中的相同位置。对于您的问题,可能是因为这两个集合在其中具有不同的对象引用。
另一个选项,Integer
是一个不可变类型,是你没有new
任何东西,而是可能做了valueOf
,并且知道{{1}的某些实现包含Integer
次调用返回的前128或256个整数值的缓存。
来自OpenJDK:
Integer.valueOf
也许在您的代码中,您的public static Integer valueOf(int i)
{
if (i < -128 || i > 127) {
return new Integer(i);
}
return valueOfCache.CACHE [i+128];
}
等于“3043”,并且您两次调用String
来获取Integer.valueOf(thatString)
个对象。但这也是错误的,因为你可以看到至少有一个实现仍然在内部Integer
高于127的任何内容,并且你回到原来的问题。
new
底线:除非你明确地单独使用Integer x = new Integer(120); // as @polygenelubricants pointed out, these two will
Integer y = new Integer(120); // never be == equal, but .equals equal, because new
// creates a brand new object in memory
Integer j = Integer.valueOf(15); // sometimes values < 128 will be cached, so j == k
Integer k = Integer.valueOf(15); // because valueOf will return the same cached object
Integer a = Integer.valueOf(3043); // 3043 is high enough that it probably isn't cached
Integer b = Integer.valueOf(3043); // so b is a reference to a different Integer
并将其放入两个集合中,否则不要认为它们是同一个对象。即使您知道它们可能是同一个对象,因为您知道一个JVM的Integer
实现缓存高达4096,所以不要依赖它。并始终使用Integer
检查对象是否相等,除非您真的想要询问它们是否指向内存中的完全相同的位置。对于equals
和Integer
等不可变对象,几乎不需要这样做。
答案 4 :(得分:1)
作为替代方案,如果适合您的应用程序环境,则可以转换为int
而不是Integer
。
答案 5 :(得分:0)
必须始终使用equals
方法比较java对象,使用==
比较原始值或实际对象引用,这在本例中显然是不同的;因此,你的平等永远不会满足。
答案 6 :(得分:0)
因为==
运算符在相同引用的意义上检查对象标识,所以它们不会通过它们包含的值进行比较,而是通过它们分配的引用进行比较。
将==
与原语一起使用是安全的,因为它们没有引用,因此在相同值的意义上检查它们是否相等但是在处理对象时(不幸的是Integer
是一个对象包装int
)它检查它们是否真的是同一个对象,而不是它们具有相同的值。
例如:
Integer x = new Integer(4);
Integer y = x;
//this will be true: same reference
assert(x == y)
如果你想保留==
运算符,你应该
if (results.get(rank).intValue() == experts.get(j).intValue())
否则切换到等于运算符:
// you don't need to cast them since equals will take care of checking
//if they are of the same type
if (results.get(rank).equals(experts.get(j)))
答案 7 :(得分:0)
您不应该将两个引用与'=='进行比较,除非您想要检查它们是否是相同的对象,如果要检查它们是否相等,请使用Object.equals()方法