6

Java 具有基本类型的对象整数和原始版本 int。

原始版本更快/更轻/等。所以一般来说你应该使用它们。

我想知道的是,为什么 Java 的设计者不仅拥有对象类型,还使用原始版本作为幕后的优化。

所以:

Integer foo(Integer alpha)
{
    Integer total = 0;
    for(Integer counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}

将被编译成类似的代码:

int foo(int alpha)
{
    int total = 0;
    for(int counter = 0; counter < alpha; counter++)
    {
        total += counter;
    }
    return total;
}

本质上,这个假设的 Java 编译器会将 Integer、Double、Float 等实例转换为等效的原始类型。只有在真正需要对象的情况下(比如将元素放入容器中)才会涉及实际的 Integer 对象。

注意:上面的代码在 Integer 对象上使用了运算符,我知道这实际上是不允许的。因为我正在发明假设的 Java 编译器,所以我会假装这个编译器对 Integer/Float/Double 有特殊的外壳,就像对 String 一样。

4

2 回答 2

5

我想知道的是,为什么 Java 的设计者不仅拥有对象类型,还使用原始版本作为幕后的优化。

要了解 Java 设计决策背后的原因,您需要了解做出这些决策的历史背景。

原始类型和引用类型之间的强烈区别被纳入 JDK 1.0 之前的语言设计中。在 JDK 1.5 之前,仅此而已:如果您想将整数放入集合中(例如),您可以显式使用Integer.valueOf(int)etc。

当自动装箱/自动拆箱被添加到 JDK 1.5 的类型系统中时,它必须以向后兼容的方式完成。他们想出的是一个很好的妥协……但如果他们从一张干净的床单开始,他们会/可能会取得的成就。

(而且他们第一次没有/不能“做对”的原因......早在 1990 年代初期,可能与原始语言范围和他们获得第一个版本所承受的时间压力有关如果他们花了几个月/几年的时间试图把它做好,那么这个项目很可能会被杀死……或者营销窗口会关闭。)

于 2011-03-12T01:20:29.080 回答
0

您需要某种方式向编译器发出您想要盒装版本的信号,对吗?否则,它怎么知道你想要的是有属性的版本还是原始版本?当你将你的传递Integer给一个评估的方法时会发生什么Integer.MAX_VALUE

于 2011-03-12T00:29:54.330 回答