任何快捷方式初始化所有数组元素为零?
在C/C++
我曾经这样做过
int arr[10] = {0};
初始化我所有的数组元素为0。
Java中有类似的捷径吗?
我想避免使用循环,这有可能吗?
int arr[] = new int[10]; for(int i=0;i<arr.length;i++) arr[i] = 0;
整数types数组的缺省值为0由语言规范保证:
在创build时,每个类variables,实例variables或数组组件都被初始化为默认值 (§15.9,§15.10)[…]对于
int
types,默认值为0,即0
。
如果你想初始化一个数组到一个不同的值,你可以使用java.util.Arrays.fill() (这当然会在内部使用一个循环)。
虽然其他答案是正确的(int数组的值默认初始化为0),但是如果你想明确地做到这一点(例如,如果你想要一个数组填充值42),你可以使用fill()方法arrays类:
int [] myarray = new int[num_elts]; Arrays.fill(myarray, 42);
或者如果你是一个内线的粉丝,你可以使用Collections.nCopies()
例程:
Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);
会给出价值:
[42, 42, 42]
(尽pipe它是Integer
,而不是int
,如果你需要原始types,你可以推迟到Apache Commons ArrayUtils.toPrimitive()
例程:
int [] primarr = ArrayUtils.toPrimitive(arr);
在java中,所有元素默认初始化为0。 你可以保存循环。
它如何降低您的应用程序的性能….? 阅读以下。
在Java语言规范中,任何对象的默认值/初始值都可以按照Follow。
对于types字节 , 默认值 为零 ,即(字节)的值为0 。
对于shorttypes, 默认值 为零 ,也就是(short)的值为0 。
对于inttypes, 默认值为 0 ,即0 。
对于longtypes, 默认值为 0 ,即0L 。
对于浮点types, 默认值为 正零 ,即0.0f 。
对于doubletypes, 默认值为 正零 ,即0.0d 。
对于chartypes, 默认值是空字符,即' \ u0000 '。
对于布尔types, 默认值为 false 。
对于所有引用types , 默认值为 null 。
通过考虑所有这些,您不需要为数组元素初始化为零值,因为默认情况下所有数组元素对于int数组都是0。
因为数组是一个容器对象,它拥有固定数量的单个types的值。 现在你的数组types是int,所以认为所有数组元素的默认值都会自动为0,因为它是保存int型的 。
现在考虑用于Stringtypes的数组 ,以便所有数组元素的默认值为 null 。
为什么不这样做……?
您可以通过使用循环来分配空值,正如您在问题中所build议的那样。
int arr[] = new int[10]; for(int i=0;i<arr.length;i++) arr[i] = 0;
但是,如果你这样做,那么它将无用的损失机器周期。 如果您在您的应用程序中使用了多个arrays,并且每个arrays都这样做,那么它将影响应用程序性能,达到相当的水平。
多使用机器周期==>更多的时间来处理数据==>输出时间会显着增加 。 以便您的应用程序数据处理可以被视为低级别(慢到某个级别)。
你可以保存循环,初始化已经被设置为0.即使是局部variables。
但请更正放置括号的地方,以便阅读(公认的最佳做法):
int[] arr = new int[10];
如果你正在使用浮点数或整数,那么你可以像这样分配默认值…
Integer[] data = new Integer[20]; Arrays.fill(data,new Integer(0));
您可以使用现有的数组大小创build一个新的空数组,并将其分配给您的数组。 这可能比其他的更快。 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
是的,数组中的int值被初始化为零。 但是你不能保证这一点。 Oracle文档指出这是一种糟糕的编码习惯。
正如所有人都提到的那样,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
。 请注意,即使使用multithreading,使用这样的静态也是安全的,因为最坏的情况是multithreading同时重新分配zeros
,这并不会伤害任何东西。
你也可以像其他人提到的那样使用Arrays.fill
。 Arrays.fill
可以在一个智能的JVM中使用memcpy
,但可能只是一个Java循环,并且检查这个边界。
基准当然你的优化。
在类中声明数组作为实例variables,即每个方法之外,JVM将默认值设置为0。 你不用担心了
另一种方法是使用上面的java 8 lambda
Arrays.stream(new Integer[nodelist.size()]).map(e -> Integer.MAX_VALUE).toArray(Integer[]::new);
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