Java 反向收款清单<;对象>;不分配ListIterator

Java 反向收款清单<;对象>;不分配ListIterator,java,android,memory-management,garbage-collection,Java,Android,Memory Management,Garbage Collection,我有一个收集清单,我需要颠倒顺序。 一切都很好 List<Point> myList = new ArrayList<Point>(); 但这会导致分配java.util.AbstractList$FullListIterator 我在pathfinder中有大约5000-10000条路径需要反转,这导致GC启动 我如何在没有任何必要分配的情况下扭转这种局面?只要有可能,我就使用通用池,但我一直在坚持这一点 您可以简单地循环列表的长度,并在索引i和(n-i-1)处交换项

我有一个收集清单,我需要颠倒顺序。 一切都很好

List<Point> myList = new ArrayList<Point>();
但这会导致分配java.util.AbstractList$FullListIterator

我在pathfinder中有大约5000-10000条路径需要反转,这导致GC启动


我如何在没有任何必要分配的情况下扭转这种局面?只要有可能,我就使用通用池,但我一直在坚持这一点

您可以简单地循环列表的长度,并在索引
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);
}

我会说,以不必再次循环的方式构建数据结构。我的意思是说。。如果您是从数据库中读取此内容,请使用
order by
子句

尝试以下操作:

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);
}
int size=myList.size();
对于(int i=0;i

所有这些分配的都是对点的一个引用,因此在您的情况下应该可以。

将循环运行到列表大小的一半,这就像交换这些
先到后
第二个带-(最后一个-1)
第三个是-(last-2)…依此类推…

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);
}

for(inti=0;i数组列表是绝对必要的吗


如果反转是您唯一重要的任务,您可以将其替换为,并在时间和空间方面获得更好的性能。

反转视图(不是副本)是否可以接受?例如。这不会分配任何新的内容吗?有新的分配。如果您的列表实现了随机访问,则它是一个O(1)操作,而不是O(n/2)对于经典副本。由于它是一个反向列表视图,行为也不同:“返回列表中的更改反映在此列表中,反之亦然”。然后“i”中的对象将丢失。最好使用swap。使用临时变量…或使用
Collections.swap()
?以及“myList.size()“外边loop@LukasEder为什么不呢。我让你用交换法来回答(我不喜欢回忆那些很少使用的方法)。@LukasEder我想我说得对(如果大小是奇数,四舍五入可以确保中间的项目无法实现)。只需复制/粘贴。+1我同意。如果有机会,让数据库处理排序或排序。据我所知,它通常知道如何更有效地处理这些内容。这是一个带有点(x,y)的2d场景实时生成,有电源、连接器和接收器,我使用Dijkstra查找最短路径,它从->到->反向
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);
}