繁体   English   中英

在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 中的数组具有固定大小。 一旦声明,您将无法更改它。 如果你试图强迫你的方式。 您每次都在创建一个新数组。 请不要出于任何原因创建array1arrayN

如果您想要动态大小,可以拉伸和收缩。 您正在寻找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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM