2014-10-03 4 views
0

Я знаю, что вы его получили, вызвав метод iterator() на ArrayList, который вы создали, но как выглядит этот метод?Как класс Java ArrayList возвращает объект Iterator?

Поскольку Iterator - это только интерфейс, определенный на Java, я не уверен, как ArrayList передает конкретную реализацию Iterator?

Я знаю, как реализовать их самостоятельно для своих классов ... Я хочу знать, как это делает ArrayList Java ... может быть, существует конкретный класс Iterator в стандартной библиотеке, о которой я не знаю?

+0

Если у вас есть JDK, у вас есть файл src.zip, который содержит источник для ArrayList.java –

+1

'class MyCustomIterator реализует Iterator'. Я рекомендую использовать grepcode, например. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/ArrayList.java/ – user2864740

+0

Я не так хорош с java ... не могли бы вы просто подтвердить, что где-то в этом методе iterator() он создает итератор объект, который реализует все необходимые методы Итератора? – RoryG

ответ

3

Вы можете найти его самостоятельно, вы

System.out.println(new ArrayList().iterator().getClass()); 

я class java.util.ArrayList$Itr вероятно, вы тоже. $ знак среднего внутреннего класса (статический или нет). И если мы идем внутри источника мы увидим

public Iterator<E> iterator() { 
    return new Itr(); 
} 

И позже в этом файле

private class Itr implements Iterator<E> { ... } 
+0

Зачем беспокоиться о получении имени класса (что, кстати, было бы бессмысленным в случае анонимного класса), если вы все равно посмотрите на источники. Первое, что нужно сделать, это просто следить за источниками. –

0

итератора выглядит следующим образом

Iterator<T> iterator() { 
    return new Iterator<T>(this); 
} 

Он возвращал новый итератор каждый раз.
Обратите внимание, вы должны сделать что-то вроде этого в вас код, чтобы не оказаться в бесконечный цикл

Iterator iterator = myCollections.iterator(); 

Используйте этот итератор объект перебрать вас коллекцию. Если вы

while(myCollections.iterator().hasNext) { 
    System.out.println(myCollections.iterator().next()); 
} 

Это будет бесконечный цикл только печать первого объекта всегда.


EDIT:


Чтобы ответить на ваш вопрос, исходит от AbstractList, который имеет конкретную реализацию для него.

+0

, но где он возвращает реализацию Iterator? – RoryG

+1

Это, вероятно, внутренний частный класс. Фактически, такая стратегия используется для развязки конкретного класса из любого класса, использующего его. Вам просто нужно знать об интерфейсе Iterator. То же самое может произойти с другими шаблонами проектирования. –

+0

ArrayList имеет свой собственный 'Itr' – talex

1

ArrayList класс внутри имеет реализацию Iterator. Либо это, либо он имеет внутренний метод, где он создает реализацию Iterator из другого класса. Причина, по которой я не знаю точно, состоит в том, что единственный способ узнать - посмотреть исходный код, который я еще не сделал. Дело в том, что у вас нет , необходимо знать, чтобы узнать внутреннюю реализацию. Вы просто знаете, что может сделать интерфейс Iterator, который определяется спецификацией интерфейса.

И да, где-то существует конкретная реализация интерфейса Iterator. Класс ArrayList использует конструктор из такой реализации, создавая объект и возвращая его вам.

Смежные вопросы