![](/img/trans.png)
[英]How to declare an array without having to give a fixed initial size in java?
[英]Declare an array in java without size
您好,我正在尝试在 Java 中声明一个数组,但我不希望该数组具有特定大小,因为每次大小都必须不同。
我使用了这个声明: int[] myarray5;
但是当我尝试下面的代码时,myarray5 出现错误
for(int i=0; i<=myarray1.length - 1; i++){
for (int j=0; j<=myarray2.length - 1; j++){
if (myarray1[i] == myarray2[j]){
myarray5[k] = myarray2[j];
k++;
}
}
}
以及在打印数组时:
for (int i=0; i<=myarray3.length-1; i++){
System.out.print(myarray3[i]+",");
}
有一个NullPointerException
因为您声明但从未初始化数组。
您可以动态声明一个数组,如下所示。
int size = 5; // or anyother value you want
int[] array = new int[size];
或者你使用一个列表。 这允许动态更改大小。 例如:
List<Integer> list = new ArrayList<>();
list.add(5); //adds number 5 to the list
int number = list.get(0); // Returns Element which is located at position 0 (so in this example in number will be "5");
我不希望数组具有特定大小,因为每次大小都必须不同。
Java 中的数组具有固定大小。 一旦声明,您将无法更改它。 如果你试图强迫你的方式。 您每次都在创建一个新数组。 请不要出于任何原因创建array1
到arrayN
。
如果您想要动态大小,可以拉伸和收缩。 您正在寻找ArrayList
。 Java 中的 ArrayList 很容易使用。
ArrayList<Type> arrayList = new ArrayList<>();
或者
List<Type> arrayList = new ArrayList<>();
但是当我尝试下面的代码时,myarray5 出现错误
我猜这将是一个ArrayIndexOutOfBoundsException
因为您的循环基于 array1 的长度,但您的其他数组(如array5
)具有不同的长度。
有几件事,正如人们所说,Java 中的常规数组必须用“new”语句和大小声明。 如果需要,您可以拥有一个空数组,但它的大小为 0。
现在,如果你想要一个动态数组,你可以使用 ArrayList。 其语法如下:
ArrayList<Primitive_Type_Here> = new ArrayList<Primitive_Data_Type_Here>();
现在,再一次,如果您不告诉数组该拥有什么,那么即使对任一数组类型执行任何操作也毫无意义。 对于 ArrayLists,您必须告诉它添加适合其类型的任何对象。 例如,我可以将“Hello World”添加到 ArrayList 中,我们可以执行以下代码。
ArrayList<String> sList = new ArrayList<String>();
sList.add("Hello World");
System.out.println("At index 0 our text is: " + sList.get(0));
//or if you want to use a loop to grab an item
for(int i = 0, size = sList.size(); i < size; i ++)
{
System.out.println("At index " + i + " our text is: " + sList.get(i));
}
**如果你想知道为什么我使用 .size() 而不是 .length 是因为 arrayLists 没有 .length 方法,而 .size 为它做同样的事情。
**如果你想知道为什么我有 int = 0, size = sList.size(); 这是因为通过这种方式您可以提高代码性能,因为您的循环具有 O(n) 复杂度,但是如果我们要这样做 i < sList.size() 它将像您一样 O(n) * sList.size()每次循环迭代不断调用 sList.size() 。
为什么在一维数组上使用嵌套循环? 当您有N-arrays
时,这就是问题。 它使您的代码不可读且难以维护。
正如其他帖子所提到的,使用 arrayList。
或者,如果出于任何原因,您不能使用 ArrayList。 至少使您的初始数组大小足够大以处理所有情况。 这样,您无需担心拉伸数组的大小。
我还注意到用于打印数组的 for 循环看起来很笨重。
要打印数组,您可以:
for (int i=0; i<myarray.length; i++) //throw away the = and the -1
System.out.print(myarray[i] + ",");
或者
for (int i : myarray) //use a for-each loop
System.out.print(i + ",");
或者
System.out.println(Arrays.toString(myarray));
数组应该在方法之外声明,并将数组作为参数传递给方法,即
methodName(int[] anySizeArray){
//TODO your code here!;
}
您的程序现在应该能够处理任意大小的数组。
那么你需要的是列表。 数组必须有大小,因为数组是如何工作的。
这是非常简单的解释:
当你声明一个大小为 5 的数组时
JVM 为该数组保留 5 个位置,并且只记住指向第一个元素的指针。
该数组 JVM 的第三个元素指向第一个元素 + 3 的指针。
另一方面,List 保留指向第一个元素的指针,并在每个元素中保留指向下一个元素的指针。 因此,如果您想要第 5 个元素,JVM 会转到第一个元素,并在其中找到第二个元素的内存位置,在第二个元素中找到第三个元素的位置。
结论:排序槽数组要快得多,但它必须是固定大小,排序槽列表较慢,但您可以根据需要添加和删除元素。
而您的问题是,您可能没有声明数组的大小,或者根本没有初始化数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.