如何声明一个数组而不必在 java 中给出固定的初始大小?

How to declare an array without having to give a fixed initial size in java?

我正在尝试声明一个数组而不必提供固定的初始大小,因为我想接受用户的大小。这是我想出的最新方法。我可以在声明时给出最大可接受值,但我不想这样做,因为它对 space.

的使用不当
class Example{
    int i;
    Scanner in = new Scanner(System.in);
    Example(){
        System.out.println("in constructor");
        System.out.println("enter array size: ");
        i = in.nextInt();
    }
    int[] arr = new int[i];
    void perform(){
        for(int j=0;j<i;j++)
            arr[j] = in.nextInt();
        for(int j=0;j<i;j++)
            System.out.println(arr[j]);
    }
}
public class Main{  
    public static void main(String[] args){
        Example obj = new Example();
        obj.perform();
    }
}

输出是这样的:-

在构造函数中
输入数组大小:
5
1 // 这是我试图输入数组的第一个元素。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

只需将其声明为 int[] arr;,但一旦您知道 i 有效(即 > 0)就立即分配它。然后你可以使用 arr.length 作为你的循环:

Example() {
    int i; // Local
    do {
        System.out.println("enter array size: ");
        i = in.nextInt();
    } while (i <= 0);
    arr = new int[i];
}

void perform() {
    for (int j = 0; j < arr.length; j++) {
        arr[j] = in.nextInt();
    }
    // etc.
}

我会推荐你​​使用 List 而不是数组,不需要初始大小,你可以随意插入元素

List<Integer> arr = new LinkedList<Integer>();

arr.add(5);
....
//Use for loop for adding numbers

您可以使用列表来代替数组,而无需声明大小。然后您可以即时添加项目。 您的 arr 将被替换为

ArrayList<Integer> myList = new ArrayList<Integer>();

然后您可以添加项目,例如

myList.add(in.nextInt());

并使用

访问特定索引处的元素
myList.get(index);

因此,在您的情况下,它看起来像这样

ArrayList<Integer> myList = new ArrayList<Integer>();
void perform(){
    for(int j=0;j<i;j++)
        myList.add(in.nextInt());
    for(int j=0;j<i;j++)
        System.out.println(myList.get(j));
}

ArrayList 是一个更好的选择,你可以在没有固定大小的情况下进行初始化,并且它比经典数组有一些更好的属性。

ArrayList<datatype> array_name = new ArrayList<datatype>(); 

确定您可以通过

添加新索引
array_name.add(new array index name); 

从用户那里获取大小后,只需在构造函数中初始化数组即可。您当前正在用户输入任何输入之前初始化数组,此时 i 的默认值为 0。请参阅下面的代码 here.

private final Scanner in = new Scanner(System.in);
private final int[] arr;
private final int i;
Example(){
    System.out.println("in constructor");
    System.out.println("enter array size: ");
    i = in.nextInt();
    arr = new int[i];
}

按如下操作:

  1. 声明 arr 没有任何大小并作为实例变量。
  2. 在构造函数中用用户输入的大小初始化arr

此外,最好将 perform() 内的 for 循环的条件设置为 j < arr.length,这样它就完全取决于 arr 的大小,而不是i 的值可能会在程序的其他部分发生变化。出于同样的原因,我已将 i 声明为构造函数内的局部变量,以便其范围仅限于构造函数(需要它的地方),而不是其他任何地方。

代码:

import java.util.Scanner;

class Example {
    Scanner in = new Scanner(System.in);
    int[] arr;

    Example() {
        System.out.println("in constructor");
        System.out.println("enter array size: ");
        int i = in.nextInt();
        if (i >= 0) {
            arr = new int[i];
        }
    }

    void perform() {
        System.out.println("Enter " + arr.length + " integers");
        for (int j = 0; j < arr.length; j++)
            arr[j] = in.nextInt();
        for (int j = 0; j < arr.length; j++)
            System.out.println(arr[j]);
    }
}

public class Main {
    public static void main(String[] args) {
        Example obj = new Example();
        obj.perform();
    }
}

样本运行:

in constructor
enter array size: 
2
Enter 2 integers
10
20
10
20