了解ArrayList中的自动装箱(大Java第7.3节)

了解ArrayList中的自动装箱(大Java第7.3节),java,Java,这里是Java初学者。我在书中谈到ArrayLists的那一部分,我的书给了我一个很酷的ArrayList示例,其中包含Strings 现在让我惊讶的是,它居然说 因为数字在Java中不是对象,所以不能直接将它们插入ArrayList。例如,您不能形成ArrayList。 相反,我们需要为所有八种基本类型使用包装器类。在这里,我的书给出了一些小例子,这些例子对我来说似乎很奇怪,让我们举下面的例子 这是自动装箱,将我们的d放入一个对象中。我想我们可以把它看作是Double d=新的Double(2

这里是Java初学者。我在书中谈到
ArrayLists
的那一部分,我的书给了我一个很酷的
ArrayList
示例,其中包含
Strings

现在让我惊讶的是,它居然说

因为数字在Java中不是对象,所以不能直接将它们插入ArrayList。例如,您不能形成
ArrayList。

相反,我们需要为所有八种基本类型使用包装器类。在这里,我的书给出了一些小例子,这些例子对我来说似乎很奇怪,让我们举下面的例子

这是自动装箱,将我们的
d
放入一个对象中。我想我们可以把它看作是
Double d=新的Double(29.95)

我们可以通过执行
double x=d来取消装箱,,
所以现在
x
只是一个值,对吗

这就是我的困惑所在。 我注意到我们可以用
Double
对象做一些算术表达式 说
d=d+1

我的书上说

在这里,d被自动解压成一个双精度

我们加1

然后自动将结果框入新的双精度

在d中存储对新创建的包装器对象的引用

我的问题

最后一部分是我很难理解的。这是什么意思?我记得在第四章中,我们了解到,当我们将两个对象设置为彼此相等时,当我们更改一个对象时,另一个对象也会更改(我相信这被称为
,通过引用


另一方面,我为什么要这样做算术呢?如果我们必须取消装箱,这看起来效率非常低。我想说的是,首先使用一个普通数组,其中
d
d=d+1
Double
基本上意味着
d=Double.valueOf(d.doubleValue()+1),即为结果分配新值。隐式添加
Double.valueOf
d.doubleValue
本质上就是自动装箱(它可以是
new Double
而不是
Double.valueOf
,但含义保持不变)

类似地,
double x=d
表示
double x=d.doubleValue()


作为一种良好的实践,我建议使用例如
.doubleValue()
Double.valueOf
将自动装箱更改为显式类型转换。任何IDE都将帮助您检测这些错误,通过显式定义转换,一些错误(通常是NPE)可能会变得更加明显。

我明白了。当我们说双d=29.95时,d是一个物体,对吗?没有价值?相对于双d=29.95,这是一个值?好吧,它是一个拥有双值的对象,这有什么真正的好处吗?我的意思是,当我们把东西设定为数字时,我们通常希望以某种方式操纵它们。如果我们让它成为一个包含双精度值的对象,我们需要进行转换。正如我在回答中所建议的,我建议显式转换。IMHO引入自动装箱是一个错误的设计决策。
Double d =  29.95