了解ArrayList中的自动装箱(大Java第7.3节)
这里是Java初学者。我在书中谈到了解ArrayList中的自动装箱(大Java第7.3节),java,Java,这里是Java初学者。我在书中谈到ArrayLists的那一部分,我的书给了我一个很酷的ArrayList示例,其中包含Strings 现在让我惊讶的是,它居然说 因为数字在Java中不是对象,所以不能直接将它们插入ArrayList。例如,您不能形成ArrayList。 相反,我们需要为所有八种基本类型使用包装器类。在这里,我的书给出了一些小例子,这些例子对我来说似乎很奇怪,让我们举下面的例子 这是自动装箱,将我们的d放入一个对象中。我想我们可以把它看作是Double d=新的Double(2
ArrayLists
的那一部分,我的书给了我一个很酷的ArrayList
示例,其中包含Strings
现在让我惊讶的是,它居然说
因为数字在Java中不是对象,所以不能直接将它们插入ArrayList。例如,您不能形成ArrayList。
相反,我们需要为所有八种基本类型使用包装器类。在这里,我的书给出了一些小例子,这些例子对我来说似乎很奇怪,让我们举下面的例子
这是自动装箱,将我们的d
放入一个对象中。我想我们可以把它看作是Double d=新的Double(29.95)代码>
我们可以通过执行double x=d来取消装箱代码>,,
所以现在x
只是一个值,对吗
这就是我的困惑所在。
我注意到我们可以用Double
对象做一些算术表达式
说d=d+1
我的书上说
在这里,d被自动解压成一个双精度
我们加1
然后自动将结果框入新的双精度
在d中存储对新创建的包装器对象的引用
我的问题
最后一部分是我很难理解的。这是什么意思?我记得在第四章中,我们了解到,当我们将两个对象设置为彼此相等时,当我们更改一个对象时,另一个对象也会更改(我相信这被称为,通过引用)
另一方面,我为什么要这样做算术呢?如果我们必须取消装箱,这看起来效率非常低。我想说的是,首先使用一个普通数组,其中dd=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