反转集合List <object>而不分配ListIterator </object>

时间:2012-08-16 07:16:26

标签: java android memory-management garbage-collection

我有一个集合列表,我需要颠倒它的顺序。

一切正常
List<Point> myList = new ArrayList<Point>();

我可以用

来扭转它
Collections.reverse(myList); 

但这导致分配java.util.AbstractList $ FullListIterator

我在探测器中有大约5000到10000个反向路径,这会导致GC启动。

如何在没有任何必要分配的情况下扭转此问题?我随时都在使用通用池,但我坚持这个。

5 个答案:

答案 0 :(得分:2)

我想说,以你不必再循环的方式构建你的数据结构。我的意思是说..如果你是从数据库中读取这个,请使用order by子句

答案 1 :(得分:2)

试试这个:

int size = myList.size();
for (int i = 0; i < size / 2; i++) {
    Point temp = myList.get(i);
    myList.set(i, myList.get(size - i - 1));
    myList.set(size - i - 1, temp);
}

所有这些分配是对Point的一个引用,因此在你的情况下应该没问题。

答案 2 :(得分:1)

您可以简单地循环列表的长度并交换索引i(n-i-1)的项目。无需分配。

int n = myList.size();
for (int i=n/2; i-->0;) {
    Object o = myList.get(i);
    myList.set(i, myList.get(n-i-1));
    myList.set(n-i-1, o);
}

答案 3 :(得分:1)

运行循环列表大小的一半,就像交换这些循环一样 first-with-last second-with-(last-1) third-with-(last-2) ...so on...

for(int i=0;i<list.size()/2;i++){           
    Object temp=list.get(i);
    list.set(i, list.get(list.size()-(i+1)));
    list.set(list.size()-(i+1), temp);
}

答案 4 :(得分:0)

绝对需要ArrayList吗?

如果逆转是您唯一的重要任务,您可以将其替换为java linked list,并在时间和空间方面获得更好的表现。