我有一个类 - 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)
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)
正如其他人所说,您无法更改现有Java数组的大小.
ArrayList是标准Java与动态大小数组最接近的.但是,有一些关于ArrayList(实际上是List接口)的东西不是"数组之类的".例如:
[ ... ]
索引列表.你必须使用get(int)
和set(int, E)
方法.set(15, foo)
.add
,insert
和remove
方法.如果你想要更像阵列的东西,你需要设计自己的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)
您可以在创建元素时将元素数设置为您想要的任何数量:
xClass[] mysclass = new xClass[n];
Run Code Online (Sandbox Code Playgroud)
然后,您可以在循环中初始化元素.我猜这就是你需要的.
如果在创建数组后需要向数组中添加或删除元素,则必须使用ArrayList
.
你可以使用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)
归档时间: |
|
查看次数: |
386066 次 |
最近记录: |