那是'Long'的工作方式(用Java编写)吗?

ami*_*lan 1 java

看看这个Java代码:

class PerformanceTest2{

    public static void main(String args[]){

        Long sum = 0L;

        for(int i=0;i<Integer.MAX_VALUE;i++)
            sum += i;

        System.out.println("Sum = " + sum);
    }
} 
Run Code Online (Sandbox Code Playgroud)

据观察,此代码需要更长的时间,因为sum是'Long'而不是'long'.所以在每次迭代中会发生什么:

sum = new Long(sum.longValue() + i); (for sum+=i;)
Run Code Online (Sandbox Code Playgroud)

因此,每次都会创建一个新对象.Java不支持C++返回引用的功能,以便我们可以编写(可能):

sum.longValue() += i;
Run Code Online (Sandbox Code Playgroud)

可能不必每次在循环周围创建sum对象?我对吗?

Jon*_*eet 7

好吧,它不会调用构造函数.它用:

for (int i = 0; i < Integer.MAX_VALUE; i++)
{
   long tmp = sum.longValue(); // Unboxing
   tmp += i;
   sum = Long.valueOf(tmp); // Boxing
}
Run Code Online (Sandbox Code Playgroud)

包装器对象是故意不可变的 - 它们很容易设计成可变的,但不变性通常是一个非常有用的功能.如果你想编写自己的可变包装类型,我们非常欢迎你 - 在这一点上你可以拥有如下代码:

LongWrapper sum = new LongWrapper(0L);
for (int i = 0; i < Integer.MAX_VALUE; i++)
{
    sum.add(i);
}
System.out.println("Sum = " + sum);
Run Code Online (Sandbox Code Playgroud)

或者可能:

LongWrapper sum = new LongWrapper(0L);
for (int i = 0;i < Integer.MAX_VALUE; i++)
{
    sum.setValue(sum.getValue() + i);
}
System.out.println("Sum = " + sum);
Run Code Online (Sandbox Code Playgroud)