我不知道为什么这个条件永远不会满足: 我比较两个ArrayList值,它总是假的。为什么这个条件永远不会满足?
if ((Integer) results.get(rank) == (Integer) experts.get(j))
我调试,我有完全相同的2个值:3043和3043 但是它不工作。
谢谢
我不知道为什么这个条件永远不会满足: 我比较两个ArrayList值,它总是假的。为什么这个条件永远不会满足?
if ((Integer) results.get(rank) == (Integer) experts.get(j))
我调试,我有完全相同的2个值:3043和3043 但是它不工作。
谢谢
使用equals()
,不==
处理。这是代表相同价值的两个不同对象。所以他们不是==
(不同的对象),而是equals()
(相同的内容)。
==只会做原语的值比较。
每当有对象类型,包括大市值为Integer,Long,等你需要平等的,而不是==
由于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()
享受
必须总是使用equals
方法比较java对象,使用==
比较原始值或实际对象引用,这在本例中明显不同;因此你的平等永远不会满足。
的==
运营商检查两个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
检查一个对象是否相等,除非你真的想要问他们是否指向内存中完全相同的位置。对于像Integer
和String
这样的不可变对象,这几乎不需要。
'新'永远不会被缓存:它必须返回一个新的对象。缓存将违背整个Java语言基础。什么是可缓存的'valueOf',通过'class Integer'。这种语言本身不允许从'new'这样的缓存。 – polygenelubricants 2010-05-09 16:52:37
谢谢@polygenelubricants,这正是我的想法! – Phil 2010-05-11 03:22:13
作为一种替代方法,如果这适用于您的应用程序上下文,则可以将其转换为int
而不是Integer
。
由于==
运算符在相同引用的意义上检查对象标识,所以它们不会被它们包含的值进行比较,而是会被它们分配的引用进行比较。
它的安全使用==
与原语,因为他们没有引用,所以它们被登记在同一价值感的平等,但使用对象时(不幸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)))
你不应该比较两个引用'=='直到除非你想检查它们是否是相同的对象,如果你想检查他们是否相等使用Object.equals()方法
你试过'等()' – 2010-05-09 14:54:07
如果你正在处理'int'它会工作... – 2010-05-09 15:06:59