如何在Java列表中存储原语数字?当我试着去做
List<double> list = new ArrayList<>();编译器告诉我,double不是一个对象。看来这些收藏品不是为原语制作的。我笨拙的解决办法如下:
List<Double> list = new ArrayList<>();但是这样做速度更慢,使用的内存也更多。有更好的方法吗?
发布于 2014-03-03 16:26:45
不能在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共用基础。
而且,我怀疑您是指List<Double> list = new ArrayList<>(); (或其他一些实现),对吗?这是因为您所做的都不会编译。
发布于 2014-03-03 16:26:21
不,没有更好的办法了。Collection实例只能保存对象,而不能保存原语。所以你的解决办法是可行的。
除非您正在编写时间关键组件,否则在这种情况下,不知道内存使用情况和/或性能可能表明您是过早优化的胜利。
发布于 2014-03-03 16:27:26
不能将集合与原语一起使用。只能将对象存储在集合中。这些对象将自动取消装箱。
这是唯一能做到的方法。
您可以从以下链接获得更多信息:http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
https://stackoverflow.com/questions/22151932
复制相似问题