2010-05-09 61 views
1

我不知道为什么这个条件永远不会满足: 我比较两个ArrayList值,它总是假的。为什么这个条件永远不会满足?

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

我调试,我有完全相同的2个值:3043和3043 但是它不工作。

谢谢

+0

你试过'等()' – 2010-05-09 14:54:07

+0

如果你正在处理'int'它会工作... – 2010-05-09 15:06:59

回答

7

使用equals(),不==处理。这是代表相同价值的两个不同对象。所以他们不是==(不同的对象),而是equals()(相同的内容)。

1

==只会做原语的值比较。

每当有对象类型,包括大市值为Integer,Long,等你需要平等的,而不是==

3

由于Uri说你需要使用方法.equals()而不是==。

==运算符只会检查result.get(rank)和experts.get(j)返回的引用是否指向相同的对象(在这种情况下它们在技术上不会)

这种方法有两种方法。 1)如果你知道一个事实,即专家将始终包含一个引用然后执行以下操作: experts.get(J).equals(results.get(秩))

2)如果你是绝对肯定((Integer)results.get(rank))。intValue()==((Integer)experts.get(j))。intValue()

享受

0

必须总是使用equals方法比较java对象,使用==比较原始值或实际对象引用,这在本例中明显不同;因此你的平等永远不会满足。

1

==运营商检查两个Object引用相同,不等于我们通常认为。这意味着对于Integer类型,它会检查它们是否指向相同的Integer。如果代码中的某处有两行创建值为3043的新Integer,而不是重复使用一个实例,那么它们不是指内存中的相同位置。对于你的问题,可能会出现这种情况,因为这两个集合在它们中有不同的对象引用。

另一种选择,为Integer是一个不变的类型,是你没new任何东西,而是也许做了valueOf,并且意识到的Integer一些实现包含属于前128或256的整数值的高速缓存返回Integer.valueOf调用。

从OpenJDK的:

public static Integer valueOf(int i) 
{ 
    if (i < -128 || i > 127) { 
     return new Integer(i); 
    } 
    return valueOfCache.CACHE [i+128]; 
} 

也许在你的代码中有一个String等于 “3043”,和你两次调用Integer.valueOf(thatString)让你Integer对象。但是这也是错误的,因为你可以看到至少有一个实现仍然会在内部new以上,高于127,并且你又回到了原来的问题。

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 

底线:除非你明确了一个Integer,并把它变成兼具收藏自己,不要以为他们是同一个对象。即使你知道它们可能是同一个对象,因为你知道一个JVM的Integer缓存实现高达4096,不要依赖它。并且总是使用equals检查一个对象是否相等,除非你真的想要问他们是否指向内存中完全相同的位置。对于像IntegerString这样的不可变对象,这几乎不需要。

+0

'新'永远不会被缓存:它必须返回一个新的对象。缓存将违背整个Java语言基础。什么是可缓存的'valueOf',通过'class Integer'。这种语言本身不允许从'new'这样的缓存。 – polygenelubricants 2010-05-09 16:52:37

+0

谢谢@polygenelubricants,这正是我的想法! – Phil 2010-05-11 03:22:13

1

作为一种替代方法,如果这适用于您的应用程序上下文,则可以将其转换为int而不是Integer

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))) 
0

你不应该比较两个引用'=='直到除非你想检查它们是否是相同的对象,如果你想检查他们是否相等使用Object.equals()方法

相关问题