Java 动态数组大小?

2022-08-31 09:09:45

我有一个类 - xClass,我想将其加载到xClass数组中,因此我声明:

xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();

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


答案 1

不可以,一旦创建,就无法更改数组的大小。您要么必须将其分配到比您认为需要的更大的位置,要么接受必须重新分配它需要增加大小的开销。当它这样做时,你将不得不分配一个新的,并将数据从旧的复制到新的:

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;

如果您发现自己处于这种情况,我强烈建议您改用Java集合。特别是ArrayList基本上包装了一个数组,并负责根据需要扩展数组的逻辑:

List<XClass> myclass = new ArrayList<XClass>();
myclass.add(new XClass());
myclass.add(new XClass());

通常,由于几个原因,a 是数组的更可取的解决方案。首先,数组是可变的。如果您有一个这样做的类:ArrayList

class Myclass {
    private int[] items;

    public int[] getItems() {
        return items;
    }
}

您造成了一个问题,因为调用方可以更改您的私人数据成员,从而导致各种防御性复制。将此版本与列表版本进行比较:

class Myclass {
    private List<Integer> items;

    public List<Integer> getItems() {
        return Collections.unmodifiableList(items);
    }
}

答案 2

在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 {}

推荐