在运行时初始化的每个数组都是动态的,这是真的吗? 在编译期间初始化的每个数组都是静态的吗?
例如:
int array[];
public main() {
array = new int[100];
}
编译器知道数组有多少元素,因此它可以在编译期间启动它?或者我需要给每个int一个值,使它变为静态? 像这样:
int array[3] { 1, 2, 3};
是否可以定义一个数组在main()函数之外应该有多少个元素? (没有给每个int一个值)像这样:
int array[100];
public main() {
}
我正在编写一个小游戏,它必须运行得非常快。我读动态数组需要更长的时间来处理,所以我想尝试使用静态数组,但我不确定数组何时变为静态或动态。
我搜索了许多不同的教程,但我找不到答案。
谢谢你的阅读。
答案 0 :(得分:7)
动态和静态分配的区别是不明确的(它在某种程度上取决于语言的含义)。在最一般意义上,静态分配意味着某些大小已经预先确定,可能是在编译时。
在java中,任何对象(包括数组)总是在运行时分配。这并不一定意味着它的动态,它可能仍然是静态的,因为它无法在运行时更改。例如:
public class Test1 {
public final int[] array1 = new int[10];
public int[] array2 = new int[20];
public void setArray2Size(int size) {
array2 = new int[size];
}
}
arrayFixed的大小为10,并且在运行时无法更改。请注意 final 关键字。这使您只能分配“array1”成员一次。因此,您无法为此成员分配不同的数组。
现在array2不是final,所以你可以在任何时候给它分配一个不同的数组,比如setArray2Size() - 方法。如果在初始赋值之后没有赋值,则array2仍然是 static ,因为它无法更改(因为没有代码可以这样做),尽管通过声明更改它是允许的。 / p>
一旦创建了一个具体的数组实例 ever (没有语言元素来表示在java中调整数组的大小)。初学者有点难以理解,但像array2 这样的变量不是数组。它是到数组的引用。但是可以将array2保存的引用替换为对另一个数组的引用,如setArray2Size() - method中的array2所示。
答案 1 :(得分:1)
declaration
时未分配内存。
例如:int array[100];
; - 不会compiles
仅在遇到new
运算符memory
时才会分配。
所以
array = new int[100];
;编译。
答案 2 :(得分:0)
是的,数组的大小仅在编译时才知道,但内存的分配将在运行时发生。 直到遇到“新”内存才会被分配给数组。