Java中的可变大小数组初始化

16

我在Java中有一个整数数组,它的初始化如下:

public int MyNumbers[] = {0,0,0,0};

我想要将数组初始化为一个长度可变的零。

private int number_of_elements = 4;
public int MyNumbers[] = {0} * number_of_elements; // ????

我作为一个从C语言转到Java的新手,对如何做这件事感到无助。有什么建议吗?

编辑

我知道可以使用for循环,但是我希望有一个简单的方法来完成它。


在Java中,int[]数组默认情况下会初始化为所有元素都是0,因此除了使用new int[n]创建一个填充了0的数组之外,不需要采取其他措施。("然后[...]创建指定长度的一维数组,并将数组的每个组件初始化为其默认值 [...] 对于类型int默认值为零,即0") - Radiodef
5个回答

32

谢谢,老兄!我猜导入行只是 java.util.Arrays,对吗? - daveslab
是的。但需要注意的一点是,根据Arrays.java(JDK 6)的源代码,上述函数确实使用了for循环。但有一天它可能会更改该行为,使用更低级别的东西,例如memset(通过JNI)。 - laginimaineb
我会信任 JVM 用非常快的代码替换这段代码。通常情况下,JVM 会对循环展开,也许它甚至会将其优化为 memset。在 Java 中,永远不要在代码层面进行优化! - akuhn

6
int[] MyNumbers = new int[number_of_elements];

1
我认为示例代码中的零只是一个例子,虽然这个一行代码可以创建填充了零的数组,但它仍然不能让OP将其填充为另一个任意值。 - laginimaineb

5

或者您可以使用ArrayList,这样您就不需要事先担心大小。 它将在需要时动态扩展内部数组。

List<Integer> numbers = new ArrayList<Integer>();
numbers.add(0);
numbers.add(2);
// ...

这里有一个教程,可以学习更多关于集合API的知识,其中包括ArrayList


1
+1 针对 ArrayList 的使用。这正是我认为他应该做的。 - Will Madison

2
int[] MyNumbers = new int[number_of_elements];

由于这是一个int类型的数组,在Java中,数组元素将自动获得0的默认值。

如果这是一个Integer对象数组,则必须在创建数组后填充数组,因为对象引用的默认值是null。要设置Object数组的默认值,可以执行以下操作:

Integer[] MyNumbers = new Integer[number_of_elements];
java.util.Arrays.fill(MyNumbers, new Integer(0));

当然,同样的技术也可以用来将 int 数组初始化为除零以外的其他值,如下所示:
int[] MyNumbers = new int[number_of_elements];
java.util.Arrays.fill(MyNumbers, 1);

2
小建议:当您填充整数数组时,应该使用'Integer.valueOf()'而不是'new Integer()',因为这将利用整数缓存(请参见http://tech.puredanger.com/2007/02/01/valueof/以获取有趣的阅读体验) - laginimaineb

0

如果你正在寻找类似于C语言中的Memset函数,我认为是没有的。如果你查看Javadoc,Arrays.fill实现似乎与for循环相同。

然而,我发现了这篇文章,讨论了同样的问题http://www.searchenginecaffe.com/2007/03/how-to-quickly-reset-value-of-java.html。看起来使用system.arraycopy是更好的解决方案,这是你可以使用的函数(从链接中复制)。

public static void bytefill(byte[] array, byte value) {
 int len = array.length;
 if (len > 0)
 array[0] = value;
  for (int i = 1; i < len; i += i) {
    System.arraycopy( array, 0, array, i, ((len - i) < i) ? (len - i) : i);
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接