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或任何其他数字。直到运行时我才知道。我可以动态更改数组中的元素数吗?如果是这样,如何?
我有一个类 - xClass,我想将其加载到xClass数组中,因此我声明:
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
但是,我不知道我是否需要10。我可能需要8或12或任何其他数字。直到运行时我才知道。我可以动态更改数组中的元素数吗?如果是这样,如何?
不可以,一旦创建,就无法更改数组的大小。您要么必须将其分配到比您认为需要的更大的位置,要么接受必须重新分配它需要增加大小的开销。当它这样做时,你将不得不分配一个新的,并将数据从旧的复制到新的:
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);
}
}
在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 {}