ArrayList的Iterator类ArrayList.Itr是私有的,所以我不能将那个人子类化。
ArrayList中的ArrayList.Itr访问是私有的,所以我不能提供自己的实现。
我能看到如何做到这一点的唯一方法是继承ArrayList,覆盖iterator(),取得迭代器和 wrap&委托它到我自己的Iterator对象,拒绝访问删除。 (或者包装并委托ArrayList本身并做同样的事情)
Collections.unmodifiableList 基本上做同样的事情。
但这会导致每次调用MyArrayList.iterator()时都会创建两个对象,这在我的环境中是次优的。
想法?
编辑:
在此环境中,GCing小对象是主要主要问题。此环境在非常短的时间内调用列表迭代器数亿次次。我们需要尽可能少的GC捶打。这不是过早的优化。这是非常晚的优化。这不是一些玩具应用程序。这是一个集群式Web规模系统,它运行在硬件的绝对极限上。
答案 0 :(得分:3)
Collections.unmodifiable
列表可能是最好的方法。我怀疑你确实已经将整个程序作为一个整体进行了分析,并发现迭代器的创建确实是执行中的瓶颈。
实际上,Java创造了大量的临时对象。这看起来并不好,但由于这个原因,它非常有效地进行了优化。
不过,你试图访问ArrayList的私有成员的事实实际上有点气味。如果在迭代列表时真的不想创建两个对象,为什么不创建基于size()
和get(int index)
的迭代器呢?
答案 1 :(得分:3)
您可以根据AbstractList
代码编写自己的ArrayList
子类。我最初认为这是一个可怕的想法,但如果这对你来说是一个关键问题,那就不是一个大课程了。
答案 2 :(得分:1)
不要微优化Java。您的应用程序的瓶颈不会是这个迭代器的“加倍”,认为理所当然。
你的解决方案很聪明,很好,专注于其他(更相关)的问题。