当我运行下面的代码时,我的输出是阻塞的,没有编译时间或运行时错误。
Integer count;
count = Integer.MIN_VALUE;
while(count != Integer.MAX_VALUE) count++;
System.out.println("Max Value reached");
我理解java并不支持运算符重载但是它没有抛出任何错误原因?
编辑:上面的代码确实有效,但它需要花费更多时间,所以我想知道为什么需要更多时间?
我替换了'整数'与' int'它正在快速返回。
答案 0 :(得分:2)
count
是Integer
。 count++
相当于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