考虑下面的代码片段以及执行它们的时间-
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");
}
输出-
时差: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");
}
输出-
时差: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");
}
输出-
时差:16秒
根据我的理解,它的发生是由于每次创建Long Object时,我不确定这是如何发生的。尝试查看字节码并没有太大帮助。帮助我了解内部到底是怎么回事?
提前感谢!
我自己不太有经验,但是我认为这是因为原始数据类型比对象有效得多。在内部,与long对象相关联的方法和功能要比long基本类型多得多,并且在创建Long对象时,由于要做的事情还更多,因此创建机器所需的时间也更长。希望这会有所帮助!
“ ++”和“ + =”运算符仅为基元定义。
因此,将它们应用于Long
时,必须先对操作员进行拆箱,然后才对操作员进行评估,然后必须进行装箱以存储结果。
每个装箱涉及一个Long
实例的创建。您的循环具有Integer.MAX_VALUE
个迭代,因此第二个循环创建超过20亿个Long
对象(每个sum+=i
操作一个),而第三个循环创建超过40亿个Long
对象(每个i++
操作一个,并且每个sum+=i
操作一个)。必须实例化这些对象,然后再收集垃圾。这会花费时间。