Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(将值添加到数字中)如何+;java中的操作员工作?_Java - Fatal编程技术网

(将值添加到数字中)如何+;java中的操作员工作?

(将值添加到数字中)如何+;java中的操作员工作?,java,Java,我想知道+操作符在java中是如何工作的,想象一下以下情况: Long number1 = 5L; Long number2 = 10L; Long number3 = number1 + number2; 第三条语句是否创建另一个对象,其中包含number1和number2的总和?如果是这样的话,最好使用number1.addValue(number2)这样的方法将number2添加到number1中,而不创建新对象 第三条语句是否创建了另一个包含number1和number2之和的对象 是

我想知道+操作符在java中是如何工作的,想象一下以下情况:

Long number1 = 5L;
Long number2 = 10L;
Long number3 = number1 + number2;
第三条语句是否创建另一个
对象
,其中包含
number1
number2
的总和?如果是这样的话,最好使用
number1.addValue(number2)
这样的方法将number2添加到number1中,而不创建新对象

第三条语句是否创建了另一个包含number1和number2之和的对象

是的

使用类似number1.addValue(number2)的方法将number2添加到number1中,并且不创建新对象,这不是更好吗

不,不会的。这将要求Java的原始包装器类是可变的。事实上,它们是不可变的

考虑这一点:

Long five = 5L;
Long ten = 10L
Long sum = five;
sum.addValue(ten);    // Hypothetically ....
问题:
five
现在的值是多少

回答:
5
现在将具有值
15
。。。因为
five
sum
是同一个对象

如果他们将包装类
Long
等设计为可变的,那么对程序员来说,使用装箱和拆箱将更加复杂

包装器类当前的
==
语义是违反直觉的,这已经够糟糕的了。例如:

Long one_million = 1,000,000L;
Long one_million_and_one = one_million + 1L;
Long one_million_again = one_million_and_one - 1L;

System.out.println(one_million.equals(one_million_again));
System.out.println(one_million == one_million_again);

。。。打印
true
false

您可以这样做
number1=number1+number2为什么需要额外的方法呢?我想你写的东西会创建新对象并将其引用放在数字1中,不是吗?你不需要显式地创建它,Long是不可变的,你可以尝试
AtomicInteger
来实现可变的