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

2022-09-05 00:36:46

我是Java的新手。

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

我正在编写的代码也将移植到Android上。

根据你的经验,实现它的最佳课程是什么?

谢谢 丹


答案 1

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,这意味着创建数字列表意味着:

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

因此,如果您正在操作大量原始数据(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 倍以上。为了更公平起见,将数组列表预先分配为正确的大小 - 它仍然慢得多。

LinkedList只有在列表的开头或中间插入时才有价值。如果你的列表是通过添加到末尾来构建的,ArrayList将彻底主导LinkedList。因此,对于按顺序构建的典型对象列表,ArrayList就是您正在寻找的。对于像int或double这样的大型基元列表,请编写自己的列表。


答案 2

您可能对 ArrayList 最感兴趣。

我认为即使是维基百科也有关于在java中使用通用列表的信息:http://en.wikipedia.org/wiki/Generics_in_Java


推荐