首页 > 解决方案 > 在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);
  }
}

^上面的代码来自罗斯德鲁对设置数组所有值的最快方法的回答?

标签: javaperformancearraylist

解决方案


有没有更快的方法来做到这一点?

据我所知,没有。当然,没有比这更快的简单方法了。

根据它的工作原理,我认为(但我没有测试过)Arrays.asList(new HashSet[n])应该是最快的解决方案。

可以实现一个自定义List实现,它类似于一个ArrayList但预初始化为 N 个null值。但在后台,初始化将与返回的List实现中发生的几乎相同。asList所以我怀疑任何性能改进都会显着......或者值得付出努力。

如果您想确定这一点,您可以编写各种选项的基准。但是,在这种情况下,我认为这不是正确的方法。

相反,我建议对整个应用程序进行基准测试和分析,以确定此列表上的操作是否是真正的性能热点。

  • 如果它不是热点,我的建议是使用该Arrays.asList方法并将时间花在更重要的事情上。

  • 如果是热点,则应考虑将 替换为List数组。根据您之前的描述,您似乎将使用List like数组;即使用位置getset操作,并且没有改变列表大小的操作。如果是这种情况,那么使用真正的数组应该更有效。它节省了内存,并避免了一定程度的间接和(可能)一些边界检查。

    不这样做的一个原因是,如果您需要将数组传递给其他需要List.


推荐阅读