我的代码基本上没有分配,但是当在60fps时,GC每30秒运行一次。使用DDMS检查应用程序的分配显示有很多
我该如何避免分配所有这些
另一种方法是扩展ArrayList,返回仅分配一次的
我想到的第三种方法是使用一个静态辅助函数,它返回一个重用
SimpleListIterator
被分配。还有一些东西被分配,因为我使用了Exchanger
。
SimpleListIterator
来自于for each循环for (T obj : objs) {}
。我原以为编译器/翻译器会优化那些不使用迭代器的类型(我基本上只使用ArrayList),但事实并非如此。我该如何避免分配所有这些
SimpleListIterators
?一种解决方案是切换到常规for循环for (int i = 0; i < size; ++i) {}
,但我喜欢for each循环:(另一种方法是扩展ArrayList,返回仅分配一次的
Iterator
。我想到的第三种方法是使用一个静态辅助函数,它返回一个重用
Iterator
的 Collection
。我已经拼凑出了类似这样的东西,但强制转换感觉非常不安全和 hackish。但应该是线程安全的,因为我使用了 ThreadLocal
。请参见下面的代码:public class FastIterator {
private static ThreadLocal<Holder> holders = new ThreadLocal<Holder>();
public static <T> Iterable<T> get(ArrayList<T> list) {
Holder cont = holders.get();
if (cont == null) {
cont = new Holder();
cont.collection = new DummyCollection<T>();
cont.it = new Iterator<T>();
holders.set(cont);
}
Iterator<T> it = (Iterator<T>) cont.it;
DummyCollection<T> collection = (DummyCollection<T>) cont.collection;
it.setList(list);
collection.setIterator(it);
return collection;
}
private FastIterator() {}
private static class Holder {
public DummyCollection<?> collection;
public Iterator<?> it;
}
private static class DummyCollection<T> implements Iterable {
private Iterator<?> it;
@Override
public java.util.Iterator<T> iterator() {
return (java.util.Iterator<T>) it;
}
public void setIterator(Iterator<?> it) {
this.it = it;
}
}
private static class Iterator<T> implements java.util.Iterator<T> {
private ArrayList<T> list;
private int size;
private int i;
@Override
public boolean hasNext() {
return i < size;
}
@Override
public T next() {
return list.get(i++);
}
@Override
public void remove() {
}
public void setList(ArrayList<T> list) {
this.list = list;
size = list.size();
i = 0;
}
private Iterator() {}
}
}
for
循环中需要额外一行代码来获取值更好?... - Ivo Wetzel