Table of Contents
Iterator and Iterable
Iterator internal details
for each principle
In-depth discussion of the relationship between Iterable and Iterator
Implement your own iterator
Customized iterator class
Support for each loop
Home Java javaTutorial Detailed introduction to Iterable and Iterator in Java

Detailed introduction to Iterable and Iterator in Java

Oct 08, 2018 pm 03:37 PM
java

This article brings you a detailed introduction to Iterable and Iterator in Java. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

In Java, we can traverse the List collection in the following ways:

List<Integer> list = new ArrayList<>();
list.add(5);
list.add(23);
list.add(42);
for (int i = 0; i < list.size(); i++) {
    System.out.print(list.get(i) + ",");
}

Iterator it = list.iterator();
while (it.hasNext()) {
    System.out.print(it.next() + ",");
}

for (Integer i : list) {
    System.out.print(i + ",");
}
Copy after login

The first is an ordinary for loop, the second is iterator traversal, and the third It's a for each loop. The latter two methods involve iterator and iterable objects in Java. Next, let's take a look at the differences between these two objects and how to implement a for each loop in a custom class.

Iterator and Iterable

iterator is an iterator object in Java, which is the underlying dependency that can iterate over a collection such as List. The iterable interface defines a method that returns iterator, which is equivalent to encapsulating iterator. At the same time, classes that implement the iterable interface can support for each loop.

Iterator internal details

The main methods of the Iterator interface in jdk are as follows:

public interface Iterator<E> {
    boolean hasNext();
    E next();
}
Copy after login

Iterator defines the method of iterative access to the collection through the above two methods, and the specific implementation method Depending on different implementation classes, the specific collection class implements the methods in the Iterator interface to implement iteration.

It can be found that the Iterator interface is not implemented in List, but the Iterable interface is implemented. Further observation of the source code of the Iterable interface shows that it just returns an Iterator object.

public interface Iterable<T> {
  Iterator<T> iterator();
}
Copy after login

So we can use the following method to iterate the List (by calling the iterator() method)

Iterator it = list.iterator();
while (it.hasNext()) {
    System.out.print(it.next() + ",");
}
Copy after login

At the same time, if you implement the Iterable interface, you can also use the for each loop.

for each principle

In fact, the for each loop also relies on the Iterator iterator, but the syntax sugar provided by Java, the Java compiler will convert it into an Iterator iterator for traversal. We decompile the following for each loop:

 for (Integer i : list) {
       System.out.println(i);
   }
Copy after login

After decompilation:

Integer i;
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){
        i = (Integer)iterator.next();        
    }
Copy after login

You can see that Java's for each enhanced loop is implemented through iterator.

In-depth discussion of the relationship between Iterable and Iterator

I have a question, why not just put the hasNext() and next() methods directly in the Iterable interface, and other classes can implement them directly?

The reason is that some collection classes may have more than one traversal method. A class that implements Iterable can implement multiple Iterator internal classes, such as ListItr and LinkedList DescendingIteratorThe two internal classes implement bidirectional traversal and reverse order traversal respectively. By returning different Iterator, different traversal methods are implemented, which is more flexible. If you merge the two interfaces, you will not be able to return different Iterator implementation classes. ListItr related source code is as follows:

    public ListIterator<E> listIterator(int index) {
        checkPositionIndex(index);
        return new ListItr(index);
    }

    private class ListItr implements ListIterator<E> {
        ...
        ListItr(int index) {
            // assert isPositionIndex(index);
            next = (index == size) ? null : node(index);
            nextIndex = index;
        }

        public boolean hasNext() {
            return nextIndex < size;
        }
        ...
Copy after login

As shown above, you can return the iterator by calling the list.listIterator() method (list.iterator() is just its default implementation )

DescendingIteratorThe source code is as follows:

    public Iterator<E> descendingIterator() {
        return new DescendingIterator();
    }
    private class DescendingIterator implements Iterator<E>     {
        private final ListItr itr = new ListItr(size());
        public boolean hasNext() {
            return itr.hasPrevious();
        }
        public E next() {
            return itr.previous();
        }
        public void remove() {
            itr.remove();
        }
    }
Copy after login

This iterator can also be used through list.descendingIterator().

Implement your own iterator

We now have a custom class ArrayMap, and now if we traverse it as follows for each:

ArrayMap<String, Integer> am = new ArrayMap<>();
am.put("hello", 5);
am.put("syrups", 10);

for (String s: am) {
   System.out.println(s);
}
Copy after login

Since we have not implemented hashNext and next abstract method, so it cannot be traversed.

Customized iterator class

We first customize an iterator class to implement hashNext and next methods, and use it as the internal class of ArrayMap. The relevant code is as follows:

   public class KeyIterator implements Iterator<K> {
        private int ptr;

        public KeyIterator() {
            ptr = 0;
        }

        @Override
        public boolean hasNext() {
            return (ptr != size);
        }

        @Override
        public K next() {
            K returnItem = keys[ptr];
            ptr += 1;
            return returnItem;
        }
    }
Copy after login

You can see that the traversal rule we specified in next is traversed based on the key value of ArrayMap. With the above iterator class, we can use the iterator method to traverse it externally. The traversal code is as follows:

ArrayMap<String, Integer> am = new ArrayMap<>();
am.put("hello", 5);
am.put("syrups", 10);
ArrayMap.KeyIterator ami = am.new KeyIterator();
while (ami.hasNext()) {
    System.out.println(ami.next());
}
Copy after login

As shown above, create a KeyIterator object for iterative access (note that the external class creates an internal class object).

Support for each loop

We cannot support for each loop access now because we have not implemented the iterable interface. First implement the Iterable interface in ArrayMap:

public class ArrayMap<K, V> implements Iterable<K> {

    private K[] keys;
    private V[] values;
    int size;

    public ArrayMap() {
        keys = (K[]) new Object[100];
        values = (V[]) new Object[100];
        size = 0;
    }
  ....
}
Copy after login

Then restart Write the iterator() method and return our own iterator object (iterator)

    @Override
    public Iterator<K> iterator() {
        return new KeyIterator();
    }
Copy after login

Note that our custom KeyIterator class must implement the Iterator interface, otherwise the type returned in the iterator() method will not match.

The above is the detailed content of Detailed introduction to Iterable and Iterator in Java. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Perfect Number in Java Perfect Number in Java Aug 30, 2024 pm 04:28 PM

Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.

Smith Number in Java Smith Number in Java Aug 30, 2024 pm 04:28 PM

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

Java Spring Interview Questions Java Spring Interview Questions Aug 30, 2024 pm 04:29 PM

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Break or return from Java 8 stream forEach? Break or return from Java 8 stream forEach? Feb 07, 2025 pm 12:09 PM

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

Guide to TimeStamp to Date in Java. Here we also discuss the introduction and how to convert timestamp to date in java along with examples.

Java Program to Find the Volume of Capsule Java Program to Find the Volume of Capsule Feb 07, 2025 am 11:37 AM

Capsules are three-dimensional geometric figures, composed of a cylinder and a hemisphere at both ends. The volume of the capsule can be calculated by adding the volume of the cylinder and the volume of the hemisphere at both ends. This tutorial will discuss how to calculate the volume of a given capsule in Java using different methods. Capsule volume formula The formula for capsule volume is as follows: Capsule volume = Cylindrical volume Volume Two hemisphere volume in, r: The radius of the hemisphere. h: The height of the cylinder (excluding the hemisphere). Example 1 enter Radius = 5 units Height = 10 units Output Volume = 1570.8 cubic units explain Calculate volume using formula: Volume = π × r2 × h (4

Create the Future: Java Programming for Absolute Beginners Create the Future: Java Programming for Absolute Beginners Oct 13, 2024 pm 01:32 PM

Java is a popular programming language that can be learned by both beginners and experienced developers. This tutorial starts with basic concepts and progresses through advanced topics. After installing the Java Development Kit, you can practice programming by creating a simple "Hello, World!" program. After you understand the code, use the command prompt to compile and run the program, and "Hello, World!" will be output on the console. Learning Java starts your programming journey, and as your mastery deepens, you can create more complex applications.

See all articles