Java动态数组大小?

Pau*_*aul 96 java

我有一个类 - xClass,我想加载到xClass数组中,所以我声明:

xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
Run Code Online (Sandbox Code Playgroud)

但是,我不知道我是否需要10.我可能需要8或12或任何其他数字.直到运行时我才会知道.我可以动态更改数组中的元素数量吗?如果是这样,怎么样?

cle*_*tus 155

不,您不能在创建后更改数组的大小.您要么必须分配比您认为需要的更大的分配,要么接受必须重新分配的开销需要增长.什么时候你必须分配一个新的并将数据从旧的复制到新的:

int oldItems[] = new int[10];
for (int i=0; i<10; i++) {
  oldItems[i] = i+10;
}
int newItems[] = new int[20];
System.arraycopy(oldItems, 0, newItems, 0, 10);
oldItems = newItems;
Run Code Online (Sandbox Code Playgroud)

如果您发现自己处于这种情况,我强烈建议您使用Java Collections.特别是ArrayList基本上包装一个数组并负责根据需要增长数组的逻辑:

List<xClass> mysclass = new ArrayList<xClass>();
myclass.add(new xClass());
myclass.add(new xClass());
Run Code Online (Sandbox Code Playgroud)

通常ArrayList,由于若干原因,无论如何都是阵列的优选解决方案.一方面,数组是可变的.如果你有一个类来执行此操作:

class Myclass {
  private int items[];

  public int[] getItems() { return items; }
}
Run Code Online (Sandbox Code Playgroud)

你创建了一个问题,因为调用者可以更改你的私人数据成员,这会导致各种防御性复制.将其与List版本进行比较:

class Myclass {
  private List<Integer> items;

  public List<Integer> getItems() { return Collections.unmodifiableList(items); }
}
Run Code Online (Sandbox Code Playgroud)

  • 我使用ArrayList而不是List,一切正常. (2认同)
  • List是接口,ArrayList是实现。将其创建为 ArrayList 但将其引用为 List(以便稍后可以更改)是正确的。 (2认同)

Osc*_*Ryz 25

在java数组中长度是固定的.

您可以使用List来保存值并在toArray需要时调用该方法请参阅以下示例:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class A  {

    public static void main( String [] args ) {
        // dynamically hold the instances
        List<xClass> list = new ArrayList<xClass>();

        // fill it with a random number between 0 and 100
        int elements = new Random().nextInt(100);  
        for( int i = 0 ; i < elements ; i++ ) {
            list.add( new xClass() );
        }

        // convert it to array
        xClass [] array = list.toArray( new xClass[ list.size() ] );


        System.out.println( "size of array = " + array.length );
    }
}
class xClass {}
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 8

正如其他人所说,您无法更改现有Java数组的大小.

ArrayList是标准Java与动态大小数组最接近的.但是,有一些关于ArrayList(实际上是List接口)的东西不是"数组之类的".例如:

  • 您不能用于[ ... ]索引列表.你必须使用get(int)set(int, E)方法.
  • 使用零元素创建ArrayList.你不能简单地创建一个包含20个元素的ArrayList然后调用set(15, foo).
  • 您无法直接更改ArrayList的大小.你这样做间接使用不同的add,insertremove方法.

如果你想要更像阵列的东西,你需要设计自己的API.(也许有人可以使用现有的第三方图书馆...我找不到使用谷歌进行2分钟"研究":-))

如果你真的需要一个在初始化时增长的数组,那么解决方案是这样的.

ArrayList<T> tmp = new ArrayList<T>();
while (...) {
    tmp.add(new T(...));
}
// This creates a new array and copies the element of 'tmp' to it.
T[] array = tmp.toArray(new T[tmp.size()]);
Run Code Online (Sandbox Code Playgroud)


new*_*cct 7

您可以在创建元素时将元素数设置为您想要的任何数量:

xClass[] mysclass = new xClass[n];
Run Code Online (Sandbox Code Playgroud)

然后,您可以在循环中初始化元素.我猜这就是你需要的.

如果在创建数组后需要向数组中添加或删除元素,则必须使用ArrayList.


Pas*_*l9x 6

你可以使用ArrayList:

import java.util.ArrayList;
import java.util.Iterator;
Run Code Online (Sandbox Code Playgroud)

...

ArrayList<String> arr = new ArrayList<String>();
arr.add("neo");
arr.add("morpheus");
arr.add("trinity");
Iterator<String> foreach = arr.iterator();
while (foreach.hasNext()) System.out.println(foreach.next());
Run Code Online (Sandbox Code Playgroud)