假设我们尝试实现一个合并排序算法,给定一个数组数组来合并一个更好的方法,这个:
public void merge(ArrayList<ArrayList<E>> a) {
ArrayList<ArrayList<E>> tmp = new ArrayList<ArrayList<E>>() ;
while (a.size()>1) {
for (int i=1; i<a.size();i+=2) {
tmp.add(merge(a.get(i-1),a.get(i)));
}
if (a.size()%2==1) tmp.add(a.get(a.size()-1));
a = tmp;
tmp = new ArrayList<ArrayList<E>>() ;
}
}
或者这个:
public void merge(ArrayList<ArrayList<E>> a) {
ArrayList<ArrayList<E>> tmp = new ArrayList<ArrayList<E>>(),tmp2 ;
while (a.size()>1) {
for (int i=1; i<a.size();i+=2) {
tmp.add(merge(a.get(i-1),a.get(i)));
}
if (a.size()%2==1) tmp.add(a.get(a.size()-1));
tmp2 = a;
a = tmp;
tmp = tmp2;
tmp.clear();
}
}
为了更清楚,我正在做的是合并 a 中的每个邻居,并将得到的合并数组放在外部数组中 tmp ,合并所有情侣后,一种方法是清除 a ,然后移动 tmp 到 a ,然后将已清除的 a 移至 TMP 即可。 第二种方法是“抛出”旧的 tmp 并获取新的 tmp ,而不是重复使用旧的 tmp 。 / p>
答案 0 :(得分:6)
作为一般规则,不要花费精力去重用旧的收藏品;它只会让你的代码更难阅读(并且经常不会给你任何实际的好处)。如果您的代码已经运行,那么只尝试这样的优化,并且您有硬数字表示算法的速度得到了提升。
答案 1 :(得分:2)
总是分配一个新的ArrayList
并填充它,会导致更多的垃圾收集,这通常会减慢一切(较小的GC很便宜,但不是免费的)。
重新使用ArrayList
会导致Arrays.copyOf()
更少ArrayList
当clear()
内的数组需要调整大小时(调整大小便宜但不免费)。
另一方面:ArrayList
也会使数组内容无效,以允许GC收集未使用的对象,当然也不是免费的。
但是,如果涉及执行速度,我会重用{{1}}。