为什么人们仍然在Java中使用基元类型?

从Java 5开始,我们已经对基元类型进行了装箱/拆箱,以便将其包装为,等等等等。intjava.lang.Integer

我最近看到很多新的Java项目(肯定需要至少版本5的JRE,如果不是6)正在使用而不是,尽管使用后者要方便得多,因为它有一些用于转换为值等的帮助器方法。intjava.lang.Integerlong

为什么有些人仍然在Java中使用基元类型?有什么实实在在的好处吗?


答案 1

在Joshua Bloch的 Effective Java,Item 5:“避免创建不必要的对象”中,他发布了以下代码示例:

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);
}

它需要43秒才能运行。将 Long 带入基元会将其降低到 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

编辑为什么(3)返回和(4)返回

因为它们是两个不同的对象。最接近零的 256 个整数 [-128; 127] 由 JVM 缓存,因此它们为这些整数返回相同的对象。但是,超出该范围时,它们不会被缓存,因此会创建一个新对象。为了使事情变得更加复杂,JLS要求至少缓存256个蝇量级。JVM实现者可以根据需要添加更多,这意味着这可以运行在缓存最近的1024的系统上,并且它们都返回true...#awkward


答案 2

自动取消装箱可能导致难以发现 NPE

Integer in = null;
...
...
int i = in; // NPE at runtime

在大多数情况下,null 赋值比上面要明显得多。in