我是一名Java的初学者。
我需要实现一个在执行期间大小会改变的对象数组。
我正在编写的代码也将被移植到Android上。
根据您的经验,最好使用哪个类来实现它?
谢谢,
丹
Java的模板功能不太完善。只要你想要一个对象数组,那么ArrayList<T>
就很好用。但对于原始类型来说,它很糟糕。
假设您有一个想要放入列表中的对象层次结构,那么ArrayList
是理想的选择:
ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();
vehicles.add(new Car(...));
vehicles.add(new Truck(...));
我假设在上面的例子中,Vehicle是基类,而Car和Truck是它的子类。
另一方面,如果你想要一个数字列表,Java非常低效。每个对象都是对12字节内存块的引用(实际上是4字节指针),再加上你实际使用的部分。由于ArrayList不能应用于int,这意味着创建数字列表需要:
因此,如果你正在处理大量的原始数据(int、float、double),编写自己的ArrayList版本可能会有所帮助。当数据很大而平台很小(比如手持Android设备)时,这尤其重要。
将此与下述内容进行比较:
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++)
list.add(i):
至:
public class IntArray {
private int[] data;
private int used;
private void grow() {
// implement code to make data double in size here...
}
public IntArray(int size) {
data = new int[size];
used = 0;
}
public void add(int i) {
if (i >= data.length) grow();
data[used++] = i;
}
}
IntArray list2 = new IntArray(1000000);
for (int i = 0; i < 1000000; i++)
list2.add(i);
当我进行基准测试时,使用原始列表的最佳方法比明显不太理想的ArrayList用法快多达10倍以上。为了更加公正,将ArrayList预先分配到正确的大小-它仍然要慢得多。
如果您要在列表的开头或中间插入数据,则LinkedList才值得使用。如果您的列表是通过添加到末尾来构建的,则ArrayList会彻底占据优势。因此,对于按顺序构建的典型对象列表,ArrayList是您正在寻找的内容。对于像int或double这样的大型原语列表,请编写自己的列表。
ArrayList
,使用LinkedList
的情况可能很少,但它们确实存在,并且在这些情况下,LinkedList
的性能可以显著提高。列表的队列使用是一个例子...与LinkedList
相比,从ArrayList
的前面删除非常昂贵。请参见此和此。 - ColinD