我执行下面的代码得到了一些令人惊讶的结果
class Test {
public static void main(String[] args) {
Short i = 122, j = 122;
if (i == j) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}
和
class Test {
public static void main(String[] args) {
Short i = 1222, j = 1222;
if (i == j) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}
当我执行这些代码时,第一个代码输出true
,而第二个代码输出false
。
我知道当我们使用==
比较对象时,它不会查找实际值,而只是比较引用。但在第一种情况下,它是在比较值,而在第二种代码中则没有。
答案 0 :(得分:10)
Short
具有内部缓存,其值范围为-128到127.因此,对于此范围内的数字,将返回Short
的相同实例。使用==进行比较时,Java按实例进行比较,因此返回true
。当数字超出此范围时,将创建两个不同的实例。因此,他们将在==
比较失败,返回false
。
通过这种缓存,我们可以节省一些内存并拥有更快的代码。
从JDK 1.7源代码中查看以下方法。自1.5以来就一直存在这种情况
public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset];
}
return new Short(s);
}
这个缓存也适用于其他包装类;您可以查看Java文档以获取更多详细信息。