首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java动态数组大小?

Java动态数组大小?
EN

Stack Overflow用户
提问于 2009-10-30 08:00:55
回答 14查看 465K关注 0票数 117

我有一个类- xClass,我想把它加载到一个xClass数组中,这样我就可以声明:

代码语言:javascript
复制
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();

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

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-10-30 08:05:08

不,数组一旦创建,就不能改变其大小。您要么必须分配比您认为需要的更大的空间,要么接受必须重新分配空间的开销。当它发生时,你将不得不分配一个新的,并将数据从旧的复制到新的:

代码语言:javascript
复制
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 Collections。特别是,ArrayList本质上包装了一个数组,并负责根据需要增加数组的逻辑:

代码语言:javascript
复制
List<XClass> myclass = new ArrayList<XClass>();
myclass.add(new XClass());
myclass.add(new XClass());

通常,出于以下几个原因,ArrayList是一个比数组更可取的解决方案。首先,数组是可变的。如果你有一个这样的类:

代码语言:javascript
复制
class Myclass {
    private int[] items;

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

你已经制造了一个问题,因为调用者可以改变你的私有数据成员,这导致了各种防御性的复制。将此版本与列表版本进行比较:

代码语言:javascript
复制
class Myclass {
    private List<Integer> items;

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

Stack Overflow用户

发布于 2009-10-30 08:45:37

在java数组中,长度是固定的。

如果需要,您可以使用列表来保存这些值并调用toArray方法,请参阅以下示例:

代码语言:javascript
复制
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 {}
票数 29
EN

Stack Overflow用户

发布于 2009-10-30 08:04:59

您可以在创建元素时将元素的数量设置为所需的任何内容:

代码语言:javascript
复制
xClass[] mysclass = new xClass[n];

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1647260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档