【发布时间】:2015-09-10 02:46:13
【问题描述】:
我有多个容量相同的 ArrayList。我通过读取文件来填写这些列表。
我知道 Array 和 ArrayList 之间的一个区别是 Array 具有固定容量,而 ArrayList 具有可变容量。您应该在声明时明确指定数组长度,但 ArrayList 会在满时重新调整大小。
ArrayList 中的任何调整大小操作都会降低性能,因为它涉及创建新数组并将内容从旧数组复制到新数组。因此,我想:
A - 使用 first 的容量显式初始化 ArrayList 的其余部分,因此这些列表不必调整自己的大小并将旧的数组元素复制到新的数组中,或者,
B - 我可以放弃其他列表,我只声明第一个列表,其余的将是具有 ArrayList 长度的数组。
例子:
答:
static ArrayList<ObjectType> list1 = new ArrayList<>();
ArrayList<ObjectType> list2 = new ArrayList<>(list1.size());
ArrayList<ObjectType> list2 = new ArrayList<>(list1.size());
...
乙:
static ArrayList<ObjectType> list1 = new ArrayList<>();
ObjectType[] array1 = new ObjectType[list1.size()];
ObjectType[] array2 = new ObjectType[list1.size()];
ObjectType[] array3 = new ObjectType[array1.length];
...
问题是:
A 示例是一种糟糕的编程技术吗?但是 B 的例子呢?
用哪个例子比较好?
【问题讨论】:
-
我完全不明白你的目标是什么。
list1的内容是什么? -
根据您要执行的操作,您可以简单地使用
ArrayList<>(list1);,它将获取list1的副本。向ArrayList提供任何大小信息的原因是为了在其接近容量时提高性能。没有好坏之分,它们都完成了同样的事情,但ArrayList是动态的,这意味着它可以增长...... -
你怎么知道你需要多少额外的列表?如果你知道这个数字,为什么不直接用那个容量初始化你的原始列表呢?
-
@Sotirios Delimanolis:我说我正在从文件中读取元素。首先,我在 list1 中添加元素。下一个 listh 的容量将与 list1 的容量相等。因此,我随后在下一个列表中添加的元素在调整大小后不必复制到新调整大小的 ArrayList 中,因为它已完全填充。对于删除评论的人:ArrayList的第一个容量不是0,而是一个正数:link
-
@Sotirios Delimanolis:我知道我需要多少额外的列表,因为我知道我在阅读的文件中寻找什么样的元素。那不是问题....
标签: java arrays list arraylist collections