在将数组声明为实例变量后,是否可以更改数组的大小?

时间:2015-03-22 18:59:38

标签: java arrays object

在我的作业中,我应该编写born()addChildren()方法。禁止使用List,因此我们只允许使用数组。每个Person都有一个对象数组作为其实例变量(子)。我申报时应该放一个恒定的尺寸吗?例如;

private Person[] children = new Person[5]; 

或者在创建大小为0的children[]之后是否可以使用这样的方法?

private Person[] children = new Person[0];

public void addChildren(Person x){
    Person[] newArray = new Person[children.length+1];
    System.arraycopy(children, 0, newArray, 0, children.length);
    /*
    * or this can be used:
    * for(i=0;i<children.length;i++)
    *   children[i] = newArray[i];
    */

    newArray[newArray.length-1] = x;
    children = newArray;
}

当我在寻找答案时,我在另一个网站上发现了这个代码,所以我不确定它是否在这种情况下正常工作。提前谢谢!

2 个答案:

答案 0 :(得分:0)

您无法修改基本数组的大小,因为它变为恒定分配的内存。你正在做的只是创建一个新数组,复制前一个数组的元素,然后传递引用。如果您无法使用ArrayLists或更高级的集合,则无法更改它。

答案 1 :(得分:0)

考虑到不能使用List的约束,创建新数组和复制元素的方法是正确的,但是当前的方式并未优化。我建议你将数组大小增加一些因素,以避免在每次添加时都使用数组副本。

这是一个简单的实现,每次用完存储空间时,都会将数组大小增加一半。 size告诉您当前“有效”元素的数量,以便实际数据数组从索引0跨越到size-1

private int size = 0;

private int capacity = 10;
private Person[] children = new Person[capacity];

private static final float factor = 0.5f;

public void addChildren(Person x) {
    if (size == capacity) {
        capacity += (int) (capacity * factor);
        Person[] newArray = new Person[capacity];
        System.arraycopy(children, 0, newArray, 0, size);
        children = newArray;
    }
    children[size++] = x;
}