Java - 实现动态大小对象数组的最佳方法

dan*_*dan 12 java android

我是Java的新手.

我必须在执行期间实现一个大小变化的对象数组.

我写的代码也将在Android上移植.

根据您的经验,实施该课程的最佳课程是什么?

谢谢,

Dov*_*Dov 22

Java具有不足的模板功能.只要你想要一个对象数组,那就ArrayList<T>好了.对于原始人来说,这太糟糕了.

假设您有一个想要放入列表的对象层次结构,那么ArrayList理想情况是:

ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();

vehicles.add(new Car(...));
vehicles.add(new Truck(...));
Run Code Online (Sandbox Code Playgroud)

我假设在上面的例子中,Vehicle是基类,Car和Truck是子类.

另一方面,如果你想要一个数字列表,Java的效率非常低.每个对象都是一个12字节内存块的引用(实际上是一个4字节指针),加上你实际使用的内容.由于ArrayList不能应用于int,这意味着创建数字列表意味着:

  1. 创建Integer列表,int的对象包装器.
  2. 每次拔出数字时都转换对象.这些天自动完成,但需要时间.
  3. 根据需要初始化5倍的存储空间.

因此,如果您正在操作大块的原始数据(int,float,double),那么在编写自己的ArrayList版本时可能是值得的.当数据很大且平台很小(如掌上电脑的东西)时,这一点尤其重要.

比较一下:

ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++)
  list.add(i):
Run Code Online (Sandbox Code Playgroud)

至:

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);
Run Code Online (Sandbox Code Playgroud)

我最后一次对它进行基准测试时,原始列表的最佳使用速度比无可否认的ArrayList最佳使用速度快10倍.更公平地说,预先分配arraylist是合适的大小 - 它仍然慢.

如果要插入列表的开头或中间,LinkedList是值得的.如果通过添加到列表来构建列表,则ArrayList将完全控制LinkedList.因此,对于按顺序构建的典型对象列表,ArrayList就是您要寻找的.对于像int或double这样的基元的大型列表,请编写自己的列表.


Qui*_*son 11

你可能最感兴趣的是ArrayList.

我想甚至维基百科都有关于在java中使用通用列表的信息:http://en.wikipedia.org/wiki/Generics_in_Java