任何将所有数组元素初始化为零的快捷方式?

时间:2010-01-28 11:57:15

标签: java

我以前做C/C++

int arr[10] = {0};

将我的所有数组元素初始化为0.
Java中是否有类似的快捷方式? 我想避免使用循环,是否可能?

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

14 个答案:

答案 0 :(得分:519)

language spec

保证了整数类型数组的默认值0
  

每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10)[...]对于类型int,默认值为零,即0

如果要将数组初始化为其他值,可以使用java.util.Arrays.fill()(当然在内部使用循环)。

答案 1 :(得分:88)

虽然其他答案是正确的(int数组值默认初始化为0),如果你想明确地这样做(例如,如果你想要一个填充值42的数组),你可以使用填充( )Arrays类的方法:

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);

或者如果你是1-liners的粉丝,你可以使用Collections.nCopies()例程:

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);

会给arr值:

[42, 42, 42]

(虽然它是Integer,而不是int,如果你需要基本类型,你可以按照Apache Commons ArrayUtils.toPrimitive()例程:

int [] primarr = ArrayUtils.toPrimitive(arr);

答案 2 :(得分:34)

在java中,默认情况下所有元素都初始化为0。你可以保存循环。

答案 3 :(得分:19)

它如何降低应用程序的性能......?阅读以下内容。

在Java语言规范中,任何对象的默认/初始值可以按照以下方式给出。

对于字节类型,默认值,即(byte)的值为 0

对于类型,默认值,即(短)的值为 0

对于 int 类型,默认值,即 0

对于类型,默认值,即 0L

对于 float 类型,默认值正零,即 0.0f

对于 double 类型,默认值正零,即 0.0d

对于 char 类型,默认值 null 字符,即“ \ u0000

对于布尔类型,默认值 false

对于所有引用类型默认值 null

通过考虑所有这些,您不需要使用数组元素的零值进行初始化,因为默认情况下,对于int数组,所有数组元素都为0。

因为数组是一个容器对象,它包含固定数量的单个类型的值。 现在,您的数组类型为 int ,因此请考虑所有数组元素的默认值自动为0 因为持有int类型

现在考虑数组 字符串类型,以便所有数组元素默认值

为什么不这样做??

您可以按照问题中的建议使用循环来指定空值。

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;

但是,如果你这样做,那将是一个无用的机器周期损失。 如果您在应用程序中使用多个阵列,并且每个阵列都使用它,那么它将会影响应用程序性能达到相当高的水平。

更多使用机器周期 ==&gt; 更多时间来处理数据 ==&gt;输出时间将显着增加。这样您的应用程序数据处理可以被视为低级别(慢速升级到某个级别)。

答案 4 :(得分:15)

您可以保存循环,初始化已经为0.即使对于局部变量。

但为了便于阅读(请认可的最佳做法),请更正放置括号的位置:

int[] arr = new int[10];

答案 5 :(得分:13)

如果您使用的是Float或Integer,则可以像这样分配默认值...

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));

答案 6 :(得分:5)

您可以使用现有的数组大小创建一个新的空数组,并可以将它们分配回您的数组。这可能比其他更快。 Snipet:

package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
    // Your array with data
    int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    //Creating same sized array with 0
    int[] tempArray = new int[yourArray.length];
    Assigning temp array to replace values by zero [0]
    yourArray = tempArray;

    //testing the array size and value to be zero
    for (int item : yourArray) {
        System.out.println(item);
    }
}
}

结果:

0
0
0
0
0    
0
0
0
0

答案 7 :(得分:1)

是,数组中的int值初始化为零。但你不能保证这一点。 Oracle文档指出这是一种糟糕的编码实践。

答案 8 :(得分:1)

初始化后,int值已经为零,正如大家所提到的那样。如果您确实需要将数组值设置为零并希望对其进行优化,请使用System.arraycopy

static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);

这在大多数或所有JRE实现中使用memcpy。注意,即使有多个线程,使用像这样的静态也是安全的,因为最坏的情况是多个线程同时重新分配zeros,这不会伤害任何东西。

您也可以像其他人提到的那样使用Arrays.fillArrays.fill 可以在智能JVM中使用memcpy,但可能只是一个Java循环和需要的边界检查。

当然,对您的优化进行基准测试。

答案 9 :(得分:1)

如果为零,则不需要初始化,因为Java中int的默认值为零。 对于非零的值,java.util.Arrays提供了许多选项,最简单的一种是填充方法。

int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr));  //[-1, -1, -1, -1, -1 ]

int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]

如果我们要基于条件填充值,我们还可以使用Arrays.setAll():

int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);

int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]

答案 10 :(得分:0)

将数组声明为类中的实例变量,即每个方法中的数据,JVM将其作为默认值。你不用再担心了

答案 11 :(得分:0)

在c / cpp中没有捷径,只能用零下标初始化所有数组。例如:

  int arr[10] = {0};

但是在Java中,有一个名为Arrays.fill()的魔术工具,它将使用您选择的整数填充数组中的所有值。例如:

  import java.util.Arrays;

    public class Main
    {
      public static void main(String[] args)
       {
         int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
         Arrays.fill(ar, 10);
         System.out.println("Array completely filled" +                          
            " with 10\n" + Arrays.toString(ar));
   }
 }

答案 12 :(得分:0)

您在问题中正确定义了它,它与 C++ 几乎相同。对于原始数据类型,您需要做的就是初始化数组。默认值为 int 0。

int[] intArray = new int[10];

答案 13 :(得分:-3)

    int a=7, b=7 ,c=0,d=0;
    int dizi[][]=new int[a][b];
    for(int i=0;i<a;i++){
        for(int q=d;q<b;q++){
            dizi[i][q]=c;               
            System.out.print(dizi[i][q]);
            c++;
        }

        c-=b+1;
        System.out.println();               
    }

结果     0123456     -1012345     -2-101234     -3-2-10123     -4-3-2-1012     -5-4-3-2-101     -6-5-4-3-2-10