Java列表中的数字

时间:2014-03-03 16:25:26

标签: java data-structures

如何在Java列表中存储原始数字?我试图做的时候

List<double> list = new ArrayList<>();

编译器告诉我double不是对象。似乎收藏品不是为原语而制作的。我笨拙的解决方法如下:

List<Double> list = new ArrayList<>();

但这速度较慢,占用内存较多。有更好的方法吗?

5 个答案:

答案 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。