在写算法题时,提交的代码有个案例没通过,通过返回结果,锁定问题出现在了两个Integer类型的值判断是否相等上,令人百思不得其解,直到看了下Integer的源码,如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
如果-127 <= i <= 128
时,会把i
放入内存中,这时用==
比较不会出现问题,如果i
的值不在这个范围内,则会new一个Integer对象,此时再用==
比较的就是对象的地址了,问题就出现在这个地方。
解决方式
:
- 使用
Integer.intValue()
方法将Integer转换为int去比较。 - 使用
equals()
比较,源码如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}