java - 在java中用null填充ArrayList的最快方法是什么?
问题描述
我想要一个包含 n 组整数的列表,最初这个列表应该用 null 填充。很多 Set 将在稍后初始化,有些将保持为空。
我尝试了不同的方法来实现这一点,其中一些包括在这里:
List<HashSet<Integer>> List_of_Sets = Arrays.asList(new HashSet[n]);
ArrayList<HashSet<Integer>> List_of_Sets = new ArrayList<>(n);
while(n-- > 0) List_of_Sets.add(null);
有没有更快的方法来做到这一点?
为澄清起见,数组的示例将Arrays.fill()
用于比:
/*
* initialize a smaller piece of the array and use the System.arraycopy
* call to fill in the rest of the array in an expanding binary fashion
*/
public static void bytefill(byte[] array, byte value) {
int len = array.length;
if (len > 0){
array[0] = value;
}
//Value of i will be [1, 2, 4, 8, 16, 32, ..., len]
for (int i = 1; i < len; i += i) {
System.arraycopy(array, 0, array, i, ((len - i) < i) ? (len - i) : i);
}
}
解决方案
有没有更快的方法来做到这一点?
据我所知,没有。当然,没有比这更快的简单方法了。
根据它的工作原理,我认为(但我没有测试过)Arrays.asList(new HashSet[n])
应该是最快的解决方案。
可以实现一个自定义List
实现,它类似于一个ArrayList
但预初始化为 N 个null
值。但在后台,初始化将与返回的List
实现中发生的几乎相同。asList
所以我怀疑任何性能改进都会显着......或者值得付出努力。
如果您想确定这一点,您可以编写各种选项的基准。但是,在这种情况下,我认为这不是正确的方法。
相反,我建议对整个应用程序进行基准测试和分析,以确定此列表上的操作是否是真正的性能热点。
如果它不是热点,我的建议是使用该
Arrays.asList
方法并将时间花在更重要的事情上。如果是热点,则应考虑将 替换为
List
数组。根据您之前的描述,您似乎将使用List
like数组;即使用位置get
和set
操作,并且没有改变列表大小的操作。如果是这种情况,那么使用真正的数组应该更有效。它节省了内存,并避免了一定程度的间接和(可能)一些边界检查。不这样做的一个原因是,如果您需要将数组传递给其他需要
List
.
推荐阅读
- node.js - 如何模拟 AWS RDSDataService 方法?
- python - 从具有列表的 CSV 文件中提取,然后循环
- html - 如何在 Algolia 搜索结果中添加图像预览?
- typescript - 如何为 omit() 函数保留通用的特定字符串 [] 类型?
- c# - MVC Web 应用程序在带有子文件夹的区域中找不到视图
- sql - 如何使用“USE”关键字来指定名称中有句点的数据库?
- java - DB2 blob 的第一个字节代表什么?
- unity3d - LoadScene() 之后的 Unity 和照明和渲染无法正常工作
- python - 根据另一列的内容创建一个新列
- machine-learning - ELI5 包为 XGBoost 功能重要性产生所有正权重