任何使从ArrayList发出的Iterator <e>的方法都有remove()阻塞而不创建两个迭代器?</e>

时间:2012-02-17 21:58:48

标签: java collections arraylist

ArrayList的Iterator类ArrayList.Itr是私有的,所以我不能将那个人子类化。

ArrayList中的ArrayList.Itr访问是私有的,所以我不能提供自己的实现。

我能看到如何做到这一点的唯一方法是继承ArrayList,覆盖iterator(),取得迭代器和 wrap&amp;委托它到我自己的Iterator对象,拒绝访问删除。 (或者包装并委托ArrayList本身并做同样的事情)

Collections.unmodifiableList 基本上做同样的事情。

但这会导致每次调用MyArrayList.iterator()时都会创建两个对象,这在我的环境中是次优的。

想法?

编辑:

在此环境中,GCing小对象是主要主要问题。此环境在非常短的时间内调用列表迭代器数亿次次。我们需要尽可能少的GC捶打。这不是过早的优化。这是非常晚的优化。这不是一些玩具应用程序。这是一个集群式Web规模系统,它运行在硬件的绝对极限上。

3 个答案:

答案 0 :(得分:3)

如你所说,

Collections.unmodifiable列表可能是最好的方法。我怀疑你确实已经将整个程序作为一个整体进行了分析,并发现迭代器的创建确实是执行中的瓶颈。

实际上,Java创造了大量的临时对象。这看起来并不好,但由于这个原因,它非常有效地进行了优化。

不过,你试图访问ArrayList的私有成员的事实实际上有点气味。如果在迭代列表时真的不想创建两个对象,为什么不创建基于size()get(int index)的迭代器呢?

答案 1 :(得分:3)

您可以根据AbstractList代码编写自己的ArrayList子类。我最初认为这是一个可怕的想法,但如果这对你来说是一个关键问题,那就不是一个大课程了。

答案 2 :(得分:1)

不要微优化Java。您的应用程序的瓶颈不会是这个迭代器的“加倍”,认为理所当然

你的解决方案很聪明,很好,专注于其他(更相关)的问题。