为什么Integer对象的计数比java中的int慢

时间:2014-10-02 15:38:11

标签: java compiler-errors runtime operator-overloading

当我运行下面的代码时,我的输出是阻塞的,没有编译时间或运行时错误。

Integer count;
count = Integer.MIN_VALUE;
while(count != Integer.MAX_VALUE) count++;
System.out.println("Max Value reached");

我理解java并不支持运算符重载但是它没有抛出任何错误原因?

编辑:上面的代码确实有效,但它需要花费更多时间,所以我想知道为什么需要更多时间?

我替换了'整数'与' int'它正在快速返回。

5 个答案:

答案 0 :(得分:2)

countIntegercount++相当于count = Integer.valueOf(count.intValue() + 1)。缓慢是由于盒子/拆箱。

答案 1 :(得分:1)

你似乎认为int和Integer基本相同。远非如此,但编译器使它看起来如此,因为它在您的背后添加了所有必要的转换(原始int和java.lang.Integer包装器之间的自动转换称为自动装箱)。

编写此代码时:

Integer count;
count = Integer.MIN_VALUE;
while(count != Integer.MAX_VALUE) count++;
System.out.println("Max Value reached");

javac为您的代码生成的内容相当于:

 Integer count;
 count = Integer.valueOf(Integer.MIN_VALUE);
 while(count.inValue() != Integer.MAX_VALUE) {
     count = Integer.valueOf(count.intValue() + 1);
 }
 System.out.println("Max Value reached");

(我只是明确添加了编译器隐式插入的调用 - 使用低于5的java版本,您需要以这种方式显式编写它,因为这些版本中没有自动装箱。)

因此生成了.intValue()和.valueOf(int)的调用。看一下.valueOf(int)的javadoc;它为几乎每个调用创建一个新的 Integer 对象。这意味着当您使用Integer而不是int时,在循环中创建了大约40亿个对象,而不是仅仅递增计数器。这就是为什么它需要更长时间。

答案 2 :(得分:0)

一切都按预期工作。循环运行了43亿次迭代,因此需要一段时间才能终止。

答案 3 :(得分:0)

它没有阻塞,它很忙。它尚未达到System.out.println("Max Value reached");

当您使用int代替Integer时,它会更快,因为没有涉及装箱/拆箱。当你使用Integer时,它也会进行隐式装箱,或者我觉得要拆箱(这里是count != Integer.MAX_VALUE),在每次循环迭代时会减慢速度。

答案 4 :(得分:0)

由于存在自动装箱(和取消装箱),因此您没有编写带错误的代码。只有循环需要很长时间才能终止。你必须再等一会儿。

您可以在此处阅读有关自动装箱的信息。 http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html