Sự khác biệt giữa Iterator và Listiterator?


138
Iterator ite = Set.iterator();
Iterator ite = List.iterator();

ListIterator listite = List.listIterator();

Chúng ta có thể sử dụng Iteratorđể đi qua a Sethoặc a Listhoặc a Map. Nhưng ListIteratorchỉ có thể được sử dụng để đi qua a List, nó không thể đi qua a Set. Tại sao?

Tôi biết rằng sự khác biệt chính là với iterator chúng ta chỉ có thể đi theo một hướng nhưng với ListIteratorchúng ta có thể đi cả hai hướng. Có sự khác biệt nào khác không? Và bất kỳ lợi thế của ListIteratorhơn Iterator?


Ngoài câu trả lời của Peters, tôi khuyên bạn nên đọc một chương về suy nghĩ trong java về các trình vòng lặp với tất cả các ví dụ hay ở đó
ant

Câu trả lời:


150

Sự khác biệt được liệt kê trong Javadoc cho ListIterator

Bạn có thể

  • lặp đi lặp lại
  • có được iterator tại bất kỳ điểm nào.
  • thêm một giá trị mới tại bất kỳ điểm nào.
  • thiết lập một giá trị mới tại thời điểm đó

68
Và lý do tại sao bạn không thể làm điều đó với một Setcách đơn giản: Không có "điểm hiện tại": Các yếu tố không có chỉ mục và không có cách nào hữu ích để bạn có thể thêm một yếu tố "trước" hoặc "sau" một yếu tố khác.
Joachim Sauer

@Peter Lawrey có được chỉ số tại bất kỳ điểm nào - Có phải về phương pháp trước Index ()next Index () ?
gstackoverflow

2
@gstackoverflow kiểm tra java.util.List # listIterator (int)
kilonet

4
@kilonet thay vì lấy chỉ số tại bất kỳ điểm nào , nó có nên được đặt cụm từ như "lấy iterator tại bất kỳ điểm nào" để tránh nhầm lẫn không?
Shailesh Pratapwar

39

Có hai điểm khác biệt:

  1. Chúng ta có thể sử dụng Iterator để duyệt qua Set và List và cả loại đối tượng Map. Mặc dù ListIterator có thể được sử dụng để duyệt qua các Đối tượng loại Danh sách, nhưng không phải cho Loại đối tượng.

    Đó là, chúng ta có thể nhận được một đối tượng Iterator bằng cách sử dụng Set and List, xem tại đây:

    Bằng cách sử dụng Iterator, chúng ta chỉ có thể truy xuất các phần tử từ Bộ sưu tập đối tượng theo hướng chuyển tiếp.

    Các phương thức trong Iterator:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Nhưng chúng tôi chỉ nhận được đối tượng ListIterator từ giao diện Danh sách, xem tại đây:

    trong đó với tư cách là ListIterator cho phép bạn di chuyển theo cả hai hướng (Cả tiến và lùi). Vì vậy, nó có hai phương thức giống hasPrevious()previous()khác hơn là các phương thức của Iterator. Ngoài ra, chúng ta có thể lấy chỉ mục của các yếu tố tiếp theo hoặc trước đó (sử dụng nextIndex()previousIndex()tương ứng)

    Các phương thức trong ListIterator:

    1. có nội dung ()
    2. kế tiếp()
    3. Trước()
    4. hasPreingly ()
    5. tẩy()
    6. next Index ()
    7. trước đó ()
    ListIterator listiterator = List.listIterator();

    tức là, chúng ta không thể lấy đối tượng ListIterator từ giao diện Set.

Tham khảo: - Sự khác biệt giữa Iterator và ListIterator là gì?


39
Điều này có vẻ như phần lớn được cắt và dán từ kirankumarjava.blogspot.com/2013/06/ . Bạn phải luôn thừa nhận tác giả gốc.
Cameron Skinner

25

Iterator là siêu hạng của ListIterator.

Dưới đây là sự khác biệt giữa chúng:

  1. Với iteratorbạn chỉ có thể di chuyển về phía trước, nhưng vớiListIterator bạn có thể di chuyển backword trong khi đọc các yếu tố.
  2. Với ListIteratorbạn có thể có được chỉ mục tại bất kỳ điểm nào trong khi di chuyển ngang, điều này là không thể vớiiterator s.
  3. Với iteratorbạn chỉ có thể kiểm tra phần tử tiếp theo có sẵn hay không, nhưng tronglistiterator bạn có thể kiểm tra các yếu tố trước và tiếp theo.
  4. Với listiteratorbạn có thể thêm yếu tố mới tại bất kỳ thời điểm nào, trong khi di chuyển ngang. Không thể vớiiterator .
  5. Với listiteratorbạn có thể sửa đổi một yếu tố trong khi di chuyển ngang, điều này là không thể iterator.

Iterator nhìn và cảm nhận:

 public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional-->use only once with next(), 
                         dont use it when u use for:each
    }

ListIterator nhìn và cảm nhận:

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); //optional
    void set(E e); //optional
    void add(E e); //optional
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.