在Java /处理中清空一个数组

ina*_*ina 39 java arrays processing

除了遍历数组中的每个元素并将每个元素设置为null之外,Java /处理中是否有一个本机函数来简单地清空一个数组(或者将其销毁,以便能够将其重新声明为一个新数组)?

Mar*_*ers 67

Arrays.fill(myArray, null);
Run Code Online (Sandbox Code Playgroud)

并不是说它与你自己做的有什么不同(它只是循环遍历每个元素并将其设置为null).它不是原生的,因为它是执行此操作的纯Java代码,但它一个库函数,如果这可能是你的意思.

这当然不允许你调整数组的大小(为零),如果你的意思是"空".数组大小是固定的,因此如果您希望"新"数组具有不同的维度,则最好只是将引用重新分配给新数组,如其他答案所示.更好的是,使用List类似于ArrayList可变大小的类型.

  • @jjnguy:好的.对阵列进行归零比创建新阵列更有效(特别是当JLS要求新阵列被归零时).事实上,这正是OpenJDK的[`ArrayList.clear()`](http://www.docjar.com/html/api/java/util/ArrayList.java.html)所做的:它将大小设置为零然后迭代数组,将每个索引归零. (3认同)
  • @IgorGanapolsky:如果你有一个 `boolean[]` 你会调用 [`fill(boolean[], boolean)`](http://docs.oracle.com/javase/7/docs/api/java/ util/Arrays.html#fill(boolean[],%20boolean)),而不是 `fill(Object[], Object)`,因此它不会接受第二个参数为 `null` (因为不能分配 `null`到“布尔值”) (2认同)

jjn*_*guy 26

您可以简单地分配null给参考.(这适用于任何类型的数组,而不仅仅是ints)

int[] arr = new int[]{1, 2, 3, 4};
arr = null;
Run Code Online (Sandbox Code Playgroud)

这将"清除"阵列.如果您愿意,还可以为该引用分配新数组:

int[] arr = new int[]{1, 2, 3, 4};
arr = new int[]{6, 7, 8, 9};
Run Code Online (Sandbox Code Playgroud)

如果您担心内存泄漏,请不要.垃圾收集器将清除阵列留下的任何引用.

另一个例子:

float[] arr = ;// some array that you want to clear
arr = new float[arr.length];
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的float[]初始化为float的默认值.

  • 不太安全,因为它会破坏使用该数组的代码的每一部分并抛出“NullPointerException” (2认同)
  • @ina,如果你为数组赋值`null`,你将无法再使用它.您必须将数组重新声明为该引用.看我的第二个例子. (2认同)
  • 我已经使用 `arr = new int[]{};` 来清除我的数组,而不是将其设为 `null`。 (2认同)

Ada*_*dam 9

array = new String[array.length];
Run Code Online (Sandbox Code Playgroud)


Shi*_*Fan 5

以 double 数组为例,如果初始输入values数组不为空,下面的代码片段在时间复杂度上优于传统的直接for-loop

public static void resetValues(double[] values) {
  int len = values.length;
  if (len > 0) {
    values[0] = 0.0;
  }
  for (int i = 1; i < len; i += i) {
    System.arraycopy(values, 0, values, i, ((len - i) < i) ? (len - i) : i);
  }
}
Run Code Online (Sandbox Code Playgroud)