Я занимаюсь исследованием интерфейса java iterator
и не могу понять, почему он так устроен.Что такое концепция java-итератора?
Почему Java-итератор использует hasNext
и next
вместо этого объединить их в один метод?
это типичное использование Java итератора
Iterator iter = //iterator from a list
while(iter.hasNext()){
Object obj = iter.next();
// do something to obj
}
почему не
Iterator iter = //iterator from a list
Object obj = null;
try {
while(true){
obj = iter.next();
// do something to obj
}
} catch (NoSuchElementException e) {}
Очевидно, такой подход выглядит некрасиво, но что произойдет, если next
возвращение нулевой, когда достигают до конца, а не бросить исключение ? чем код можно упростить
Iterator iter = //iterator from a list
Object obj = null;
while((obj = iter.next()) != null){
// do something to obj
}
это как NSEnumerator в Objective-C работает
NSEnumerator *enumerator = // from an array
while (id obj = [enumerator nextObject]) {
// do something to obj
}
Это увеличивает накладные расходы на реализацию пользовательских iterator
.
Это также делает итератор Java не потокобезопасным. Например, у ArrayList есть один элемент. Два потока одновременно запрашивают один и тот же итератор для этого списка hasNext
. Затем оба потока будут видеть true
, и они будут вызывать next
на этом итераторе. Потому что есть только один элемент, и итератор был задан дважды, что определенно приведет к состоянию исключения или ошибки.
Я знаю, что есть потокобезопасный итератор, но я не уверен, что он реализуется, но я думаю, что происходит много блокировок, которые делают его неэффективным.
Я думаю, что проблема в том, что проверка и обновление не происходят из-за атомарности, и я не могу понять, почему Java разработал интерфейс iterator
.
Update
Я вижу, что нуль может быть значением, так что мой подход неверен. Но возможно ли какое-либо возможное обходное решение проблем, о которых я говорил выше?
Вы беспокоитесь о ясности исходного кода или о стоимости выполнения вызова 'hasNext()', а затем 'next()'? –
Я делаю проект университетского курса, связанный с итератором Java, поэтому просто хочу узнать об этом больше –
Хорошо. В реальном мире ясность исходного кода почти всегда вызывает большую озабоченность, чем незначительные улучшения производительности. Вам придется выполнить * ужасный * цикл циклов до того, как стоимость дополнительного вызова метода станет существенным фактором времени выполнения. –