【发布时间】:2012-02-17 21:58:48
【问题描述】:
ArrayList 的迭代器类 ArrayList.Itr 是私有的,所以我不能继承那个家伙。
ArrayList 中的 ArrayList.Itr 访问是私有的,所以我无法提供自己的实现。
我能看到如何做到这一点的唯一方法是继承 ArrayList、覆盖 iterator()、获取该迭代器并将其包装和委托到我自己的拒绝访问删除的 Iterator 对象。 (或者包装和委托 ArrayList 本身并做同样的事情)
Collections.unmodifiableList 基本上做同样的事情。
但这会导致每次调用 MyArrayList.iterator() 时都会创建两个对象,这在我的环境中是次优的。
想法?
编辑:
在这种环境中,对小对象进行 GC 是一个主要问题。这种环境在很短的时间内调用列表迭代器数亿次。我们需要尽可能少的 GC 抖动。这不是过早的优化。这是非常晚的优化。这不是一些玩具应用程序。这是一个在硬件绝对极限下运行的集群网络规模系统。
【问题讨论】:
-
为什么需要停止 remove() 调用?你在写 API 吗?
-
我希望列表是不可变的。 Collections.unmodifiableList 在调用 Iterator 时会创建两个对象。
-
您是否通过坚持认为 2 个对象是不可接受的而过早优化?它不必复制整个列表,只需包装并委托给它(remove() 除外),因此内存不应该成为问题,并且构造包装器应该很快——实际上是免费的。
-
您为什么要关心另外两个对象?这些只是包装器,创建和垃圾收集非常便宜。您是否测量过它引起了问题?还是你过早地轻视万恶之源?
-
他们多年前构建并优化了
Collections.unmodifiable()。你真的认为你能比平台的创造者和维护者做得更好吗?我告诉你一个秘密,它创建的对象比你想象的要多,你不会做得更好。
标签: java collections arraylist