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

gam*_*ver 261 java

C/C++我以前做

int arr[10] = {0};
Run Code Online (Sandbox Code Playgroud)

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

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;
Run Code Online (Sandbox Code Playgroud)

Mic*_*rdt 540

语言规范保证了整数类型数组的默认值0 :

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

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


Ada*_*kin 95

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

int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);
Run Code Online (Sandbox Code Playgroud)

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

Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);
Run Code Online (Sandbox Code Playgroud)

会给arr的价值:

[42, 42, 42]
Run Code Online (Sandbox Code Playgroud)

(虽然它是Integer,但不是int,如果你需要原始类型,你可以遵循Apache CommonsArrayUtils.toPrimitive()例程:

int [] primarr = ArrayUtils.toPrimitive(arr);
Run Code Online (Sandbox Code Playgroud)

  • 单行是好的,但`List <Integer>`到`Integer []`到`int []`?这有点令人费解. (8认同)
  • @dhardy当然,但这就是为什么答案中也有2行版本的原因(如果您担心“复杂的”因素)。 (2认同)

Arn*_*sch 35

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

  • @ tfb785:这是错的.如上所述,Michael Borgwardt:原始整数类型(short,int,long)初始化为0. (7认同)
  • 好的,确切地说:原始类成员(无论是静态的还是非静态的)都用0初始化.局部变量不是. (3认同)
  • 我想这适用于原始类型?! (2认同)

小智 21

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

在Java语言规范中,任何对象的默认/初始值可以如下给出.

对于类型字节,所述默认值,即,(字节)的值是0.

对于类型,所述默认值,即,的值(短)是0.

对于类型INT,所述默认值,即,0.

对于类型时,默认值,也就是0L.

对于类型浮子,该默认值正零,即,0.0F.

对于类型,则默认值正零,也就是0.0D.

对于类型字符,则默认值字符,也就是" \ u0000的 ".

对于类型布尔型,则默认值假的.

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

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

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

现在考虑String类型数组,以便所有数组元素的默认值都null.

为什么不这样做......?

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

int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
    arr[i] = 0;
Run Code Online (Sandbox Code Playgroud)

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

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


KLE*_*KLE 16

你可以保存循环,初始化已经为0.即使是局部变量.

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

int[] arr = new int[10];
Run Code Online (Sandbox Code Playgroud)


Pan*_*yal 14

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

Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用现有的数组大小创建一个新的空数组,并可以将它们分配回您的数组.这可能比其他更快.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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

结果:

0
0
0
0
0    
0
0
0
0
Run Code Online (Sandbox Code Playgroud)