当前位置: 首页 > 面试题库 >

与Integer.MAX_VALUE和使用System.out.println进行比较时,for循环会提前终止

亢奇
2023-03-14
问题内容

当我运行此类时,for循环似乎提前终止

class Test {

    public static void main(String[] args) {
        int result = 0;
        int end = Integer.MAX_VALUE;
        int i;
        for (i = 1; i <= end; i += 2) {
            System.out.println(i);
        }
        System.out.println("End:" + i);
    }

}

输出为:

1
3
5
...
31173
31175
End:31177

为什么到此结束?有趣的是,如果我System.out.println(i)在for循环中删除了,输出将是End:-2147483647。显然,ihas中的值wrapped round

我正在使用的Java版本是

Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

问题答案:

它是Java 6中的一个已知错误。JIT错误地优化了循环。我相信Java的最新版本没有此错误。

http://vanillajava.blogspot.co.uk/2011/05/when-jit-gets-it-
wrong.html

Java 6更新16已有两年多了。如果您无法更新到Java 7,建议您更新到最新版本的Java 6 update 25。

BTW Java 6将在几个月后终止免费支持(2012年12月)



 类似资料:
  • 我一直在做一些实践技术面试问题,这个问题很容易,但是我想知道我的两个解决方案中更有效的是否真的如此。 我现在看到这里的其他人以前问过这个问题,但我的问题有代码片段,我觉得它可能会为其他正在寻找解决方案的人提供进一步的见解。 问题是:给定一个整数数组和一些数字k,创建一个函数,如果数组中的任意两个数字与k相加,则返回true。 以下是我的“慢”解决方案: 还有我的“快速”解决方案: 我遇到的问题是A

  • 问题内容: 我有一段简单的代码,该代码 应该 是一个无休止的循环,因为它将一直在增长,并且始终会比更大。 但实际上,它可以打印并且不会无限循环。我不知道为什么。但是,当我以以下方式调整代码时: 这变成一个无尽的循环,我不知道为什么。java是否会识别出一个无穷循环并在第一种情况下跳过它,而在第二种情况下必须执行一个方法调用,以使其表现出预期的效果?困惑:) 问题答案: 这两个例子并不是无止境的。

  • 我有一段简单的代码,它应该是一个无休止的循环,因为将一直增长,并且始终大于。 但按原样,它打印并且不会无休止地循环。我想不出为什么。但是,当我以以下方式调整代码时: 它变成了一个无休止的循环,我不知道为什么。java是否认识到它是一个无休止的循环并在第一种情况下跳过它,但在第二种情况下必须执行一个方法调用,这样它的行为就像预期的那样?困惑:)

  • 有了这个,我会检查服务最后一次运行的时间,以及是否有必要再次运行。 我正在将当前日期转换为整数。但后来我得到一个错误:错误: 08-27 17:21:40.930:W/System.err(26577):java.lang.NumberFormatException:无效int:“201308271721” 08-27 17:21:40.930:W/System.err(26577):java.l

  • 问题内容: 我希望用户输入一个字符串,如果该字符串与我的regex表达式不匹配,则希望输出一条消息,然后用户再次输入一个值。 问题是,即使字符串与正则表达式匹配,它也将其视为不匹配。 我的正则表达式:这应该等于- 我的循环: 问题答案: 这些方法检查字符串是否相等,而不检查匹配的正则表达式。 只需替换为。您还应该卸下外部方括号。

  • 问题内容: 似乎PHP的运算符区分大小写。那么有使用理由吗? 执行以下操作是否安全? 问题答案: 使用它的原因是因为 如果str1小于str2,则返回<0;如果str1大于str2,则> 0;如果相等,则> 0。 仅返回或,它不会告诉您哪个是“更大”的字符串。