我的代码基本上是免费分配的,但是当60fps时,GC每30秒运行一次.使用DDMS检查应用程序以进行分配显示有大量的SimpleListIterator被分配.还有一些东西被分配,因为我使用
Exchanger.
SimpleListIterator来自(T obj:objs){}的每个循环.我的印象是编译器/翻译器会优化那些不使用迭代器来支持它的类型(我基本上只使用ArrayList),但似乎并非如此.
如何避免分配所有这些SimpleListIterators?一种解决方案是切换到常规for循环(int i = 0; i< size; i){}但我喜欢每个循环:( 另一种方法是扩展ArrayList,它返回一个只分配一次的Iterator. 我一起攻击的第三种方法是使用静态辅助函数,它返回一个重用迭代器的Collection.我一起攻击了这样的东西,但铸件感觉非常黑暗和不安全.它应该是线程安全的,因为我使用ThreadLocal?见下文:
public class FastIterator {
private static ThreadLocal holders = new ThreadLocal();
public static Iterable get(ArrayList list) {
Holder cont = holders.get();
if (cont == null) {
cont = new Holder();
cont.collection = new DummyCollection();
cont.it = new Iterator();
holders.set(cont);
}
Iterator it = (Iterator) cont.it;
DummyCollection collection = (DummyCollection) 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 implements Iterable {
private Iterator> it;
@Override
public java.util.Iterator iterator() {
return (java.util.Iterator) it;
}
public void setIterator(Iterator> it) {
this.it = it;
}
}
private static class Iterator implements java.util.Iterator {
private ArrayList 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 list) {
this.list = list;
size = list.size();
i = 0;
}
private Iterator() {}
}
}