自Java5以来,我们已经对基本类型进行了装箱/拆箱,以便将int
包装为java.lang.Integer
,依此类推.
我最近看到很多新的Java项目(definitely需要至少版本5的JRE,如果不是版本6的话)使用int
而不是java.lang.Integer
,尽管后者更方便,因为它有一些用于转换为long
值等的辅助方法.
为什么在Java中有still多个使用基元类型?有什么切实的好处吗?
自Java5以来,我们已经对基本类型进行了装箱/拆箱,以便将int
包装为java.lang.Integer
,依此类推.
我最近看到很多新的Java项目(definitely需要至少版本5的JRE,如果不是版本6的话)使用int
而不是java.lang.Integer
,尽管后者更方便,因为它有一些用于转换为long
值等的辅助方法.
为什么在Java中有still多个使用基元类型?有什么切实的好处吗?
In Joshua Bloch's Effective Java, Item 5: "Avoid creating unnecessary objects", he posts the following code example:
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
run 需要43秒.把长时间放在原语中会把时间降到6.8秒...如果这能说明我们为什么使用原语的话.
缺乏原生价值平等也是一个问题(.equals()
与==
相比相当冗长)
对于biziclop:
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
结果是:
false
false
true
false
EDIT Why does (3) return true
and (4) return false
?
因为它们是两个不同的物体.最接近零的256个整数[-128;127]由JVM缓存,因此它们返回相同的对象.但是,超出该范围后,它们不会被缓存,因此会创建一个新对象.为了让事情变得更复杂,JLS要求缓存at least256个飞锤.JVM实现者可以根据需要添加更多,这意味着这可以在一个系统上运行,其中最近的1024个被缓存,并且所有这些都返回true#令人尴尬的