我有一个集合列表,我需要颠倒它的顺序。
一切正常List<Point> myList = new ArrayList<Point>();
我可以用
来扭转它Collections.reverse(myList);
但这导致分配java.util.AbstractList $ FullListIterator
我在探测器中有大约5000到10000个反向路径,这会导致GC启动。
如何在没有任何必要分配的情况下扭转此问题?我随时都在使用通用池,但我坚持这个。
答案 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,并在时间和空间方面获得更好的表现。