为什么人们仍然在Java中使用原始类型?

问题

从Java 5开始,我们已经有了原始类型的装箱/拆箱,因此int被包装为java.lang.Integer,依此类推。

我最近看到很多新的Java项目(至少需要一个至少版本为5的JRE,如果不是6),它们使用的是int而不是java.lang.Integer,尽管使用后者要方便得多,因为它有一些辅助方法可以转换为longvalues等。 。

为什么某些仍然是在Java中使用原始类型?有没有明显的好处?


#1 热门回答(340 赞)

在Joshua Bloch'sEffective Java,第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()相比于==相当冗长)

for 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)returntrue和(4)returnfalse

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


#2 热门回答(75 赞)

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

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

在大多数情况下,对于in的空赋值远不如上面那么明显。


#3 热门回答(39 赞)

原始类型:

int x = 1000;
int y = 1000;

现在评估:

x == y

It'strue。不足为奇。现在尝试盒装类型:

Integer x = 1000;
Integer y = 1000;

现在评估:

x == y

It'sfalse。大概。取决于运行时。那个理由够了吗?