如何在Java列表中存储原始数字?我试图做的时候
List<double> list = new ArrayList<>();
编译器告诉我double
不是对象。似乎收藏品不是为原语而制作的。我笨拙的解决方法如下:
List<Double> list = new ArrayList<>();
但这速度较慢,占用内存较多。有更好的方法吗?
答案 0 :(得分:2)
您无法在Java中的集合中直接使用基元。这是Java中的一个深思熟虑的设计决策(虽然有些人认为这是一个错误)。事实上,Java中的泛型被拴在一起,这就是为什么他们的应用程序在整个语言中并不统一。
容器基本上希望对象类型和基元类型不是从Object
派生的(即,Object
不是它们的超类,而不像Java中的每个其他对象)。从代码编写的角度来看,它看起来肯定没有包装器:
list.add(6); //list is of type List<Integer>
int num = list.get(i);
这是因为装箱和拆箱是自动完成的。在字节码级别,您实际拥有的是:
list.add(new Integer(6));
int num = ((Integer) list.get(i)).intValue();
所以你拥有的第二个选择是Java中的正确方法。
如果您想要一个内存不足的选项,您可以选择直接double[]
。但是,这意味着您将不得不编写代码来管理添加,检索,更新和删除操作。如果这是额外的工作,您可以尝试使用Apache Commons Primitives。
另外,我怀疑你的意思是List<Double> list = new ArrayList<>();
(或其他一些实现),对吧?这是因为你所拥有的不会编译。
答案 1 :(得分:0)
不,没有更好的方法。 Collection
的实例只能保留在对象上,而不是原始对象上。因此,您的解决方法是可行的方法。
除非您正在编写时间关键组件,否则在这种情况下想知道内存使用情况和/或性能可能表明您是过早优化的时间。
答案 2 :(得分:0)
您不能将集合与基元一起使用。您只能在集合中存储对象。这些对象将自动取消装箱。
这是它可以做到的唯一方式。
您可以从以下链接获取更多信息:http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
答案 3 :(得分:0)
没有更好的方法。至少Java在例如之间提供automatic conversions后退和前进。 double和Double可以减少痛苦('autoboxing'/'autounboxing',因为它已知)
答案 4 :(得分:-2)
您可以使用集合。 double不是Object而是Double。