一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java Iterator接口和LIstIterator接口分析

java Iterator接口和LIstIterator接口分析

2020-11-01 23:01非水非云 Java教程

這篇文章主要介紹了java Iterator接口和LIstIterator接口分析的相關資料,需要的朋友可以參考下

java  Iterator接口和LIstIterator接口分析

目錄

1.Iterator接口
2.ListIterator
3.Iterator和ListIterator的區別 

正文

在繼續看ArrayList源碼之前,先了解Iterator接口和ListIterator接口,下篇文章詳細講解ArrayList是如何實現它們的。

我們知道,接口只是一種規范,當繼承接口并實現其中的方法時,要遵循接口對方法的說明。

1.Iterator接口

Iterator接口取代了Java集合框架中的Enumeratrion。Iterators不同于enumerations的地方主要有兩點:

  Iterators允許調用者在迭代過程中從集合里移除元素;

  方法名得到了改善。

Iterator源碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
 * An iterator over a collection. {@code Iterator} takes the place of
 * {@link Enumeration} in the Java Collections Framework. Iterators
 * differ from enumerations in two ways:
 * Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.
 * Method names have been improved.
 * This interface is a member of the Java Collections Framework.
 * @param <E> the type of elements returned by this iterator*/
public interface Iterator<E> {
  /**
   * Returns {@code true} if the iteration has more elements.
   * (In other words, returns {@code true} if {@link #next} would
   * return an element rather than throwing an exception.)
   * @return {@code true} if the iteration has more elements
   */
  boolean hasNext();
 
  /**
   * Returns the next element in the iteration.
   * @return the next element in the iteration
   * @throws NoSuchElementException if the iteration has no more elements
   */
  E next();
 
  /**
   * Removes from the underlying collection the last element returned
   * by this iterator (optional operation). This method can be called
   * only once per call to {@link #next}. The behavior of an iterator
   * is unspecified if the underlying collection is modified while the
   * iteration is in progress in any way other than by calling this
   * method.
   *
   * @implSpec
   * The default implementation throws an instance of
   * {@link UnsupportedOperationException} and performs no other action.
   *
   * @throws UnsupportedOperationException if the {@code remove}
   *     operation is not supported by this iterator
   *
   * @throws IllegalStateException if the {@code next} method has not
   *     yet been called, or the {@code remove} method has already
   *     been called after the last call to the {@code next}
   *     method
   */
  default void remove() {
    throw new UnsupportedOperationException("remove");
  }
 
  /**
   * Performs the given action for each remaining element until all elements
   * have been processed or the action throws an exception. Actions are
   * performed in the order of iteration, if that order is specified.
   * Exceptions thrown by the action are relayed to the caller.
   *
   * @implSpec
   * <p>The default implementation behaves as if:
   * <pre>{@code
   *   while (hasNext())
   *     action.accept(next());
   * }</pre>
   *
   * @param action The action to be performed for each element
   * @throws NullPointerException if the specified action is null
   * @since 1.8
   */
  default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
      action.accept(next());
  }
}

Iterator接口定義了四個方法以及各個方法的功能,如果有類實現了這個接口,且實現了這些方法,這方法需要實現定義的功能,遵循這些規則:

  1).hasNext() 判斷容器是否有下一個元素,有則返回true;

  2).next() 返回容器中的下一個元素;

  3).remove() 移除當前迭代器返回的最后一個元素。這個方法在每次調用next()方法之后只能調用一次;

  4).Java 8 增加forEachRemaining方法,它可以實現對余下的所有元素執行指定的操作。

更詳細的說明請閱讀源碼中的注釋。

2.ListIterator

ListIterator在Iterator基礎上提供了add、set、previous等對列表的操作。但是ListIterator跟Iterator一樣,仍是在原列表上進行操作。

ListIterator源碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
 * An iterator for lists that allows the programmer
 * to traverse the list in either direction, modify
 * the list during iteration, and obtain the iterator's
 * current position in the list. A {@code ListIterator}
 * has no current element; its <I>cursor position</I> always
 * lies between the element that would be returned by a call
 * to {@code previous()} and the element that would be
 * returned by a call to {@code next()}.
 * An iterator for a list of length {@code n} has {@code n+1} possible
 * cursor positions, as illustrated by the carets ({@code ^}) below:
 * <PRE>
 *           Element(0)  Element(1)  Element(2)  ... Element(n-1)
 * cursor positions: ^      ^      ^      ^         ^
 * </PRE>
 * Note that the {@link #remove} and {@link #set(Object)} methods are
 * <i>not</i> defined in terms of the cursor position; they are defined to
 * operate on the last element returned by a call to {@link #next} or
 * {@link #previous()}.
 *
 * This interface is a member of the Java Collections Framework.*/
public interface ListIterator<E> extends Iterator<E> {
  // Query Operations
 
  /**
   * Returns {@code true} if this list iterator has more elements when
   * traversing the list in the forward direction. (In other words,
   * returns {@code true} if {@link #next} would return an element rather
   * than throwing an exception.)
   *
   * @return {@code true} if the list iterator has more elements when
   *     traversing the list in the forward direction
   */
  boolean hasNext();
 
  /**
   * Returns the next element in the list and advances the cursor position.
   * This method may be called repeatedly to iterate through the list,
   * or intermixed with calls to {@link #previous} to go back and forth.
   * (Note that alternating calls to {@code next} and {@code previous}
   * will return the same element repeatedly.)
   *
   * @return the next element in the list
   * @throws NoSuchElementException if the iteration has no next element
   */
  E next();
 
  /**
   * Returns {@code true} if this list iterator has more elements when
   * traversing the list in the reverse direction. (In other words,
   * returns {@code true} if {@link #previous} would return an element
   * rather than throwing an exception.)
   *
   * @return {@code true} if the list iterator has more elements when
   *     traversing the list in the reverse direction
   */
  boolean hasPrevious();
 
  /**
   * Returns the previous element in the list and moves the cursor
   * position backwards. This method may be called repeatedly to
   * iterate through the list backwards, or intermixed with calls to
   * {@link #next} to go back and forth. (Note that alternating calls
   * to {@code next} and {@code previous} will return the same
   * element repeatedly.)
   *
   * @return the previous element in the list
   * @throws NoSuchElementException if the iteration has no previous
   *     element
   */
  E previous();
 
  /**
   * Returns the index of the element that would be returned by a
   * subsequent call to {@link #next}. (Returns list size if the list
   * iterator is at the end of the list.)
   *
   * @return the index of the element that would be returned by a
   *     subsequent call to {@code next}, or list size if the list
   *     iterator is at the end of the list
   */
  int nextIndex();
 
  /**
   * Returns the index of the element that would be returned by a
   * subsequent call to {@link #previous}. (Returns -1 if the list
   * iterator is at the beginning of the list.)
   *
   * @return the index of the element that would be returned by a
   *     subsequent call to {@code previous}, or -1 if the list
   *     iterator is at the beginning of the list
   */
  int previousIndex();
 
 
  // Modification Operations
 
  /**
   * Removes from the list the last element that was returned by {@link
   * #next} or {@link #previous} (optional operation). This call can
   * only be made once per call to {@code next} or {@code previous}.
   * It can be made only if {@link #add} has not been
   * called after the last call to {@code next} or {@code previous}.
   *
   * @throws UnsupportedOperationException if the {@code remove}
   *     operation is not supported by this list iterator
   * @throws IllegalStateException if neither {@code next} nor
   *     {@code previous} have been called, or {@code remove} or
   *     {@code add} have been called after the last call to
   *     {@code next} or {@code previous}
   */
  void remove();
 
  /**
   * Replaces the last element returned by {@link #next} or
   * {@link #previous} with the specified element (optional operation).
   * This call can be made only if neither {@link #remove} nor {@link
   * #add} have been called after the last call to {@code next} or
   * {@code previous}.
   *
   * @param e the element with which to replace the last element returned by
   *     {@code next} or {@code previous}
   * @throws UnsupportedOperationException if the {@code set} operation
   *     is not supported by this list iterator
   * @throws ClassCastException if the class of the specified element
   *     prevents it from being added to this list
   * @throws IllegalArgumentException if some aspect of the specified
   *     element prevents it from being added to this list
   * @throws IllegalStateException if neither {@code next} nor
   *     {@code previous} have been called, or {@code remove} or
   *     {@code add} have been called after the last call to
   *     {@code next} or {@code previous}
   */
  void set(E e);
 
  /**
   * Inserts the specified element into the list (optional operation).
   * The element is inserted immediately before the element that
   * would be returned by {@link #next}, if any, and after the element
   * that would be returned by {@link #previous}, if any. (If the
   * list contains no elements, the new element becomes the sole element
   * on the list.) The new element is inserted before the implicit
   * cursor: a subsequent call to {@code next} would be unaffected, and a
   * subsequent call to {@code previous} would return the new element.
   * (This call increases by one the value that would be returned by a
   * call to {@code nextIndex} or {@code previousIndex}.)
   *
   * @param e the element to insert
   * @throws UnsupportedOperationException if the {@code add} method is
   *     not supported by this list iterator
   * @throws ClassCastException if the class of the specified element
   *     prevents it from being added to this list
   * @throws IllegalArgumentException if some aspect of this element
   *     prevents it from being added to this list
   */
  void add(E e);
}

ListIterator的功能更加強大,定義的方法有:

  1).hasNext() 向前遍歷時,如果有下一個元素返回真;

  2).next() 返回下一個元素的值,并將指針加1;

  3).hasPrevious() 向相反方向遍歷時,如果還有元素返回真;

  4).previous() 返回上一個元素的值,并將指針前移1;

  5).nextIndex() 返回此時調用next()方法時返回的元素的索引;

  6).previousIndex() 返回此時調用previous()方法時返回的元素的索引;

  7).remove() 移除最近一次調用next()或previous()方法返回的元素(可選);

  8).set(E e) 用元素e將如果此時調用next()或previous()方法返回的元素替換掉;

  9).add(E e) 添加元素到此時調用next()返回的元素之前,或此時調用previous()返回的元素之后。

更詳細的說明請閱讀源碼中的注釋。

3.Iterator和ListIterator的區別

  Iterator和ListIterator的方法對比如下表:

 

Iterator

ListIterator

 

hasNext()

hasNext() 覆蓋

next()

next() 覆蓋

remove()

remove() 覆蓋

forEachRemaining(Consumer<? super E> action)

forEachRemaining(Consumer<? super E> action) 繼承
  hasPrevious()  
  previous()  
  nextIndex()  
  previousIndex()  
  set(E e)  
  add(E e)  

 

二者的不同之處主要有:

  1).Iterator只能單向移動,ListIterator可以雙向移動;

  2).ListIterator可以刪除、替換或添加元素,而Iterator只能刪除元素;

  3).ListIterator可以返回當前(調用next()或previous()返回的)元素的索引,而Iterator不能。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://www.cnblogs.com/songwenlong/p/6910799.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产99久久精品 | 女生被草 | 天美影视文化传媒mv免费 | 亚洲人成综合在线播放 | 美妇在男人胯下哀求 | 免费精品国产 | 欧美大片一区二区 | 美女全身无遮挡 | 亚洲国产成人精品无码区99 | 日本一本二本三区免费 | 男人搡女人视频免费看 | 99re8在这里只有精品23 | 国产精自产拍久久久久久 | 三级黄色图片 | 99热国产这里只有精品99 | 三上悠亚国产精品一区 | 456在线观看| 成人au免费视频影院 | 秋霞一级 | 黄瓜视频免费 | 91亚洲精品丁香在线观看 | 色中色软件 | 视频在线观看入口一二三2021 | 无限资源在线观看完整版免费下载 | 第一次破学生处破 | 成人免费影院 | 天天摸天天碰色综合网 | fc2成人免费共享视频 | 亚洲精品午夜视频 | 青草青视频 | 亚洲欧美视频在线播放 | 亚洲AV久久无码精品蜜桃 | 日本中文字幕黑人借宿影片 | 99视频有精品视频免费观看 | kkkk4444在线看片 | 99久久精品国产片久人 | 爽好舒服使劲添高h视频 | 久久精品亚洲精品国产欧美 | 国产尤物精品视频 | 91香蕉在线 | 5555国产在线观看精品 |