java - 为什么 java 中的 collection.toArray() 不支持自动装箱

标签 java arrays collections

没有任何捷径可以很好地做到这一点吗?

丑陋的两个循环(一个循环读取 pmList,第二个循环添加到 markupArray)是唯一的选择(而不是 ArrayUtils)。

ArrayList<Double> pmList = new ArrayList<Double>();     
pmList.add(0.1); // adding through a loop in real time.
pmList.add(0.1);
pmList.add(0.1);
pmList.add(0.1);

double[] markupArray = new double[pmList.size()];
arkupArray = pmList.toArray(markupArray); // This says The method toArray(T[]) in the type ArrayList<Double> is not applicable for the arguments (double[])

最佳答案

只需使用 Double[] 数组,而不是 double[],然后一切正常。如果提前知道列表的大小,也可以跳过列表,直接插入到数组中。遍历输入两次甚至可能是值得的:一次用于检索其大小,一次用于插入。

自动装箱仅适用于原始类型,不适用于原始类型数组double[] 数组不是 T[] 数组,因为类型参数 T 必须始终是 Object .虽然 double 可以自动装箱为 T(使用 T=Double),但 double[] 不能自动装箱到 T[]

数组不自动装箱的原因可能是此操作的成本非常高:装箱数组意味着创建一个新数组并装箱每个元素。对于大型阵列,这会对性能造成巨大影响。您不希望隐式完成如此昂贵的操作,因此不会对数组进行自动装箱。此外,装箱一个完整的数组会产生一个新数组。因此,在写入新数组时,更改不会写入旧数组。所以你看,数组装箱存在一些语义问题,所以它不受支持。

如果您必须返回一个 double[] 数组,那么您必须编写自己的函数或使用像 Guava 这样的第三方库(参见 msandiford 的回答)。 Java Collections 框架没有用于对数组进行(取消)装箱的方法。

关于java - 为什么 java 中的 collection.toArray() 不支持自动装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24428748/

相关文章:

java - 如何更新文件中包含的序列化 HashMap?

javascript - 如何在外部 Javascript 中使用 PHP 变量

python - 具有可变数量因子的 Numpy 向量化求和

javascript - 使用 mongodb 进行拉动刷新和无限集合加载

java - SQL Server 数据库连接错误

Java二维对象数组——如何检查某个索引是否存在?

java - 如何为大日志文件编写 Java 文本文件查看器

javascript - 通过创建水平表的数组进行映射

java - java List适合addAll和clear上的线程安全的什么方法

collections - Java7中的集合中间操作库