为什么这种情况永远不会满足?

时间:2010-05-09 14:51:50

标签: java

我不知道为什么这种情况永远不会得到满足: 我正在比较两个ArrayList值,它总是错误的。

if ( (Integer) results.get(rank) == (Integer) experts.get(j))

我正在调试,我有完全相同的2个值:3043和3043 但它不起作用。

感谢

8 个答案:

答案 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检查对象是否相等,除非您真的想要询问它们是否指向内存中的完全相同的位置。对于equalsInteger等不可变对象,几乎不需要这样做。

答案 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()方法