Answers:
语言规范保证整数类型数组的默认值为0 :
每个类变量,实例变量或数组组件在创建时都会用默认值初始化(第15.9节,第15.10节)。对于type
int
,默认值为零,即0
。
如果要将一维数组初始化为其他值,则可以使用java.util.Arrays.fill()(当然,它会在内部使用循环)。
Arrays.fill
不一定要使用循环。
尽管其他答案是正确的(int数组值默认情况下初始化为0),但是如果您想显式地这样做(例如,如果您想要用值42填充数组),则可以使用以下方法的fill()方法:该数组类:
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 CommonsArrayUtils.toPrimitive()
例程:
int [] primarr = ArrayUtils.toPrimitive(arr);
List<Integer>
要Integer[]
到int[]
?这有点令人费解。
Arrays.fill
方法初始化2d数组会造成问题,并且会发生错误。
Java中的所有元素(原始整数类型byte
short
,int
,long
)由缺省初始化为0。您可以保存循环。
它如何降低应用程序的性能...?阅读以下内容。
在Java语言规范中,任何对象的默认值/初始值都可以指定为Follows。
对于类型字节,所述默认值是零,即,(字节)的值是0。
对于类型短,所述默认值是零,即,(短)的值是0。
对于类型INT,所述默认值是零,即,0。
对于类型长时,默认值是零,也就是0L。
对于类型浮子,该默认值是正零,即,0.0F。
对于类型双,则默认值是正零,也就是0.0D。
对于类型字符,则默认值是空字符,也就是“ \ u0000的 ”。
对于类型布尔型,则默认值是假的。
对于所有引用类型的默认值是零。
通过考虑所有这些,您不需要为数组元素初始化零值,因为默认情况下,对于int数组,所有数组元素均为0。
因为数组是一个包含固定数量的单一类型值的容器对象。现在,您的数组类型为int,因此请考虑所有数组元素的默认值将自动为0,因为它持有int type。
现在考虑的阵列为字符串类型,使所有的数组元素具有默认值是零。
为什么不这样做……?
您可以按照问题中的建议使用循环来分配空值。
int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
arr[i] = 0;
但是,如果这样做,则将浪费无用的机器周期。如果您在应用程序中使用有多个数组的应用程序,并且对每个数组进行操作,那么它将对应用程序性能产生极大的影响。
更多地使用机器周期==>更多时间来处理数据==>输出时间将大大增加。因此您的应用程序数据处理可以被认为是低级别的(慢到某个级别)。
如果您使用的是Float或Integer,则可以像这样分配默认值...
Integer[] data = new Integer[20];
Arrays.fill(data,new Integer(0));
您可以使用现有的数组大小创建一个新的空数组,也可以将它们分配回您的数组。这可能比其他更快。片段:
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值已经为零。如果您确实需要将数组值设置为零并想要对其进行优化,请使用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);
memcpy
在大多数或所有JRE实现中,这都是在后台使用的。请注意,即使在有多个线程的情况下,使用这样的静态方法也是安全的,因为最坏的情况是多个线程可以zeros
同时重新分配,这不会造成任何伤害。
您也可以Arrays.fill
像其他人提到的那样使用。Arrays.fill
可以使用memcpy
在智能JVM,但可能只是一个Java循环和边界检查带来什么。
当然,对您的优化进行基准测试。
在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));
}
}
如果为零,则不需要初始化,因为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]