在java中用null填充ArrayList的最快方法是什么?

Rip*_*lla 5 java performance arraylist

我想要一个包含 n 组整数的列表,最初这个列表应该用 null 填充。许多 Sets 将在稍后初始化,有些将保持为 null。

我尝试了不同的方法来实现这一点,其中一些包括在这里:

List<HashSet<Integer>> List_of_Sets = Arrays.asList(new HashSet[n]);
Run Code Online (Sandbox Code Playgroud)
ArrayList<HashSet<Integer>> List_of_Sets = new ArrayList<>(n);
while(n-- > 0) List_of_Sets.add(null);
Run Code Online (Sandbox Code Playgroud)

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

为了澄清起见,将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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 3

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

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

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

可以实现List类似于 an 的自定义实现ArrayList,但预先初始化为 N 个null值。但在幕后,初始化将与返回的List实现中发生的情况几乎相同asList。因此,我怀疑任何性能改进是否都是显着的……或者值得付出努力。

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

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

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

  • 如果是热点,应该考虑List用数组替换。从您之前的描述来看,您似乎将List 数组一样使用;即使用位置getset操作,并且没有更改列表大小的操作。如果是这样的话,那么使用真实数组应该会更有效。它节省内存,并避免一定程度的间接寻址和(可能)一些边界检查。

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