Ash*_*rma 4 java autoboxing loops long-integer
考虑下面的代码片段以及执行它们所需的时间 -
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
long sum = 0L;
for(int i = 0; i< Integer.MAX_VALUE; i++){
sum+=i;
}
Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
System.out.println("Time Difference : " + timeDiff + "secs");
}
Run Code Online (Sandbox Code Playgroud)
输出 -
时差:0秒
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
Long sum = 0L;
for(int i = 0; i< Integer.MAX_VALUE; i++){
sum+=i;
}
Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
System.out.println("Time Difference : " + timeDiff + "secs");
}
Run Code Online (Sandbox Code Playgroud)
输出 -
时差:8秒
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
Long sum = 0L;
for(Long i = 0L; i< Integer.MAX_VALUE; i++){
sum+=i;
}
Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
System.out.println("Time Difference : " + timeDiff + "secs");
}
Run Code Online (Sandbox Code Playgroud)
输出 -
时差:16秒
根据我的理解,这是因为每次创建长对象的对象时都会发生这种情况,我不确定这是如何发生的。尝试研究字节码并没有多大帮助。帮助我了解事情的内部到底是如何发生的?
提前致谢!
“++”和“+=”运算符仅针对基元定义。
因此,当您将它们应用于 a 时Long,必须在计算运算符之前进行拆箱,然后必须进行装箱来存储结果。
装箱可能比拆箱花费更多,因为拆箱只需要方法调用,而装箱需要对象实例化。
每个装箱都涉及创建一个Long实例。您的循环有Integer.MAX_VALUE迭代,因此第二个循环创建超过 20 亿个Long对象(每个sum+=i操作一个),而第三个循环创建超过 40 亿个Long对象(每个i++操作一个,每个sum+=i操作一个)。这些对象必须被实例化并随后被垃圾收集。这需要时间。