Любой способ заставить Iterator <E>, испускаемый из ArrayList, заблокировать remove () БЕЗ создания двух Iterator? - PullRequest
0 голосов
/ 18 февраля 2012

Класс итератора ArrayList ArrayList.Itr является частным, поэтому я не могу создать подкласс этого парня.

Доступ к ArrayList.Itr в ArrayList является частным, поэтому я не могу предоставить свою собственную реализацию.1004 * Единственный способ понять, как это сделать - это создать подкласс ArrayList, переопределить iterator (), взять этот итератор и обернуть и делегировать его моему собственному объекту Iterator, который запрещает доступ для удаления.(Или оберните и делегируйте ArrayList себе и сделайте то же самое)

Collections.unmodifiableList делает то же самое, в основном.

Но это приведет к созданию двух объектовкаждый раз, когда вызывается MyArrayList.iterator (), что в моей среде неоптимально.

Идеи?

edit:

В этой среде GCing небольших объектов является главная серьезная проблема .Эта среда вызывает итераторы списков сотен миллионов раз за очень короткие периоды.Нам нужно как можно меньше GC побеждать.Это не преждевременная оптимизация.Это очень поздняя оптимизация.Это не какое-то игрушечное приложение.Это кластерная система веб-масштаба, работающая с абсолютным пределом аппаратного обеспечения.

Ответы [ 3 ]

3 голосов
/ 18 февраля 2012

Вы можете написать свой собственный подкласс AbstractList на основе кода ArrayList.Сначала я думал, что это ужасная идея, но если это критическая проблема для вас, это не большой класс.

3 голосов
/ 18 февраля 2012

Collections.unmodifiable список, как вы упоминаете, вероятно, лучший путь.Я сомневаюсь, что вы действительно профилировали свою программу в целом и обнаружили, что создание итераторов действительно является узким местом в выполнении.

На самом деле Java создает тонны и тонны временных объектов.Это нехорошо, но из-за этого он очень оптимизирован для эффективного выполнения.

Кстати, тот факт, что вы пытаетесь получить доступ к закрытым членам ArrayList, на самом деле немного пахнет.Почему бы не создать итератор на основе size() и get(int index), если вы действительно не хотите создавать два объекта при итерации по списку?

1 голос
/ 18 февраля 2012

Не оптимизируйте микро Java. Узким местом вашего приложения не будет «удвоение» этого итератора, принимайте как должное .

Ваше решение разумно и просто отлично, вместо этого сконцентрируйтесь на других (более актуальных) проблемах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...