内功心法 -- java.util.ArrayList<E> (5)

写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>中的Iterator和List操作进行介绍,主要内容包括:

1、ArrayList的Iterator和ListIterator操作

2、ArrayList的subList操作

参考内容:

1、JDK源码(1.7)

-------------------------------------------------------------------- 

1. ArrayList的Iterator和List操作                                                                         

Iterator和子List操作 

关于Iterator操作这里涉及到"迭代器模式",可以简单看看

(1)Iterator<E> iterator()       

功能: 返回列表的Iterator实例

示例代码:

 1 import java.util.ArrayList;
 2 import java.util.Iterator;
 3 
 4 public class ArrayListTest {
 5     public static void main(String[] args) {
 6         ArrayList<Integer> list = new ArrayList<Integer>();
 7         list.add(22);
 8         list.add(33);
 9         list.add(44);
10         list.add(11);
11         list.add(15);
12         list.add(12);
13         list.add(7);
14         list.add(3);
15         System.out.println("list1 :" + list);
16         //测试ArrayList的'Iterator<E> iterator()'方法的使用
17         Iterator<Integer> it = list.iterator();
18         while(it.hasNext()){
19             System.out.print(it.next() +" ");
20         }
21         System.out.println("");
22         System.out.println("list2 :" + list);
23         it.remove();
24         System.out.println("list3 :" + list);
25     }
26 }
27 
28 运行结果:
29 list1 :[22, 33, 44, 11, 15, 12, 7, 3]
30 22 33 44 11 15 12 7 3 
31 list2 :[22, 33, 44, 11, 15, 12, 7, 3]
32 list3 :[22, 33, 44, 11, 15, 12, 7]

源代码如下:(这个方法直接用了一个内部类来帮助实现功能)

1     public Iterator<E> iterator() {
2         //每次调用iterator()方法都会去new一个Itr类
3         return new Itr();
4     }
 1     private class Itr implements Iterator<E> {
 2         //下一个返回元素的索引
 3         int cursor;       // index of next element to return
 4         //最近返回元素的索引
 5         int lastRet = -1; // index of last element returned; -1 if no such
 6         //fast-fail标记标识
 7         int expectedModCount = modCount;
 8 
 9        //如果列表仍有元素可以迭代,则返回true
10         public boolean hasNext() {
11             return cursor != size;
12         }
13 
14         //返回迭代的下一个元素
15         @SuppressWarnings("unchecked")
16         public E next() {
17             //检查fast-fail机制
18             checkForComodification();
19             int i = cursor;
20             if (i >= size)
21                 throw new NoSuchElementException();
22             Object[] elementData = ArrayList.this.elementData;
23             if (i >= elementData.length)
24                 throw new ConcurrentModificationException();
25             cursor = i + 1;
26             return (E) elementData[lastRet = i];
27         }
28         //从迭代器指向的列表中移除迭代器返回的最后一个元素
29         public void remove() {
30             //检查迭代器是否返回过元素
31             if (lastRet < 0)
32                 throw new IllegalStateException();
33             //检查fast-fail机制
34             checkForComodification();
35 
36             try {
37                 //删除列表中最后返回的那个元素
38                 ArrayList.this.remove(lastRet);
39                 cursor = lastRet;
40                 lastRet = -1;
41                 expectedModCount = modCount;
42             } catch (IndexOutOfBoundsException ex) {
43                 throw new ConcurrentModificationException();
44             }
45         }
46 
47         //检查fast-fail机制标识
48         final void checkForComodification() {
49             if (modCount != expectedModCount)
50                 throw new ConcurrentModificationException();
51         }
52     }

(2)ListIterator<E> listIterator()

功能: 返回列表的ListIterator实例

源代码如下:(这个方法直接用了一个内部类来帮助实现功能)

1 public ListIterator<E> listIterator() {
2    return new ListItr(0);
3 }

(3)ListIterator<E> listIterator(int index)

功能: 返回列表的ListIterator实例

源代码如下:(这个方法直接用了一个内部类来帮助实现功能)

1     public ListIterator<E> listIterator(int index) {
2         //首先检查index是否合法,如果不合法则抛出异常
3         if (index < 0 || index > size)
4             throw new IndexOutOfBoundsException("Index: "+index);
5          //创建一个ListItr对象
6          return new ListItr(index);
7     }
 1     private class ListItr extends Itr implements ListIterator<E> {
 2        /*带参数构造函数*/ 
 3        ListItr(int index) {
 4             super();
 5             cursor = index;
 6         }
 7         //如果以逆向遍历列表,列表迭代器有多个元素,则返回true
 8         public boolean hasPrevious() {
 9             return cursor != 0;
10         }
11         //返回对next的后续调用所返回的元素的索引
12         public int nextIndex() {
13             return cursor;
14         }
15         //返回对previous的后续调用所返回元素的索引
16         public int previousIndex() {
17             return cursor - 1;
18         }
19         //返回列表中前一个元素
20         @SuppressWarnings("unchecked")
21         public E previous() {
22             //检查fast-fail机制标识
23             checkForComodification();
24             //返回索引下标值减1
25             int i = cursor - 1;
26             if (i < 0)
27                 throw new NoSuchElementException();
28             Object[] elementData = ArrayList.this.elementData;
29             if (i >= elementData.length)
30                 throw new ConcurrentModificationException();
31             cursor = i;
32             //返回元素
33             return (E) elementData[lastRet = i];
34         }
35         //用指定元素替换next或者previous返回的最后一个元素
36         public void set(E e) {
37             if (lastRet < 0)
38                 throw new IllegalStateException();
39             //检查fast-fail机制
40             checkForComodification();
41 
42             try {
43                 ArrayList.this.set(lastRet, e);
44             } catch (IndexOutOfBoundsException ex) {
45                 throw new ConcurrentModificationException();
46             }
47         }
48         //将指定的元素插入列表
49         public void add(E e) {
50             //检查fast-fail机制
51             checkForComodification();
52 
53             try {
54                 int i = cursor;
55                 //添加元素e到计划中
56                 ArrayList.this.add(i, e);
57                 cursor = i + 1;
58                 lastRet = -1;
59                 expectedModCount = modCount;
60             } catch (IndexOutOfBoundsException ex) {
61                 throw new ConcurrentModificationException();
62             }
63         }
64     }

(4)List<E> subList(int fromIndex, int toIndex)

功能: 返回列表从索引位置fromIndex到toIndex之间元素组成的子列表

源代码如下:

  1 public List<E> subList(int fromIndex, int toIndex) {
  2         //检查参数fromIndex和toIndex是否合法
  3         subListRangeCheck(fromIndex, toIndex, size);
  4         //创建一个SubList对象
  5         return new SubList(this, 0, fromIndex, toIndex);
  6     }
  7 
  8     static void subListRangeCheck(int fromIndex, int toIndex, int size) {
  9         //起始位置fromIndex小于0,则抛出异常
 10         if (fromIndex < 0)
 11             throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
 12         //终止位置toIndex大于列表中元素个数size,则抛出异常
 13         if (toIndex > size)
 14             throw new IndexOutOfBoundsException("toIndex = " + toIndex);
 15         //起始位置fromIndex 大于 终止位置toIndex,则抛出异常
 16         if (fromIndex > toIndex)
 17             throw new IllegalArgumentException("fromIndex(" + fromIndex +") > toIndex(" + toIndex + ")");
 18     }
 19 
 20 /*
 21 内部类,为了配合subList方法
 22 */
 23 private class SubList extends AbstractList<E> implements RandomAccess {
 24         private final AbstractList<E> parent;
 25         private final int parentOffset;
 26         private final int offset;
 27         int size;
 28         //构造方法
 29         SubList(AbstractList<E> parent,
 30                 int offset, int fromIndex, int toIndex) {
 31             this.parent = parent;
 32             this.parentOffset = fromIndex;
 33             this.offset = offset + fromIndex;
 34             this.size = toIndex - fromIndex;
 35             this.modCount = ArrayList.this.modCount;
 36         }
 37 
 38         public E set(int index, E e) {
 39             rangeCheck(index);
 40             checkForComodification();
 41             E oldValue = ArrayList.this.elementData(offset + index);
 42             ArrayList.this.elementData[offset + index] = e;
 43             return oldValue;
 44         }
 45 
 46         public E get(int index) {
 47             rangeCheck(index);
 48             checkForComodification();
 49             return ArrayList.this.elementData(offset + index);
 50         }
 51 
 52         public int size() {
 53             checkForComodification();
 54             return this.size;
 55         }
 56 
 57         public void add(int index, E e) {
 58             rangeCheckForAdd(index);
 59             checkForComodification();
 60             parent.add(parentOffset + index, e);
 61             this.modCount = parent.modCount;
 62             this.size++;
 63         }
 64 
 65         public E remove(int index) {
 66             rangeCheck(index);
 67             checkForComodification();
 68             E result = parent.remove(parentOffset + index);
 69             this.modCount = parent.modCount;
 70             this.size--;
 71             return result;
 72         }
 73 
 74         protected void removeRange(int fromIndex, int toIndex) {
 75             checkForComodification();
 76             parent.removeRange(parentOffset + fromIndex,
 77                                parentOffset + toIndex);
 78             this.modCount = parent.modCount;
 79             this.size -= toIndex - fromIndex;
 80         }
 81 
 82         public boolean addAll(Collection<? extends E> c) {
 83             return addAll(this.size, c);
 84         }
 85 
 86         public boolean addAll(int index, Collection<? extends E> c) {
 87             rangeCheckForAdd(index);
 88             int cSize = c.size();
 89             if (cSize==0)
 90                 return false;
 91 
 92             checkForComodification();
 93             parent.addAll(parentOffset + index, c);
 94             this.modCount = parent.modCount;
 95             this.size += cSize;
 96             return true;
 97         }
 98 
 99         public Iterator<E> iterator() {
100             return listIterator();
101         }
102 
103         public ListIterator<E> listIterator(final int index) {
104             checkForComodification();
105             rangeCheckForAdd(index);
106             final int offset = this.offset;
107 
108             return new ListIterator<E>() {
109                 int cursor = index;
110                 int lastRet = -1;
111                 int expectedModCount = ArrayList.this.modCount;
112 
113                 public boolean hasNext() {
114                     return cursor != SubList.this.size;
115                 }
116 
117                 @SuppressWarnings("unchecked")
118                 public E next() {
119                     checkForComodification();
120                     int i = cursor;
121                     if (i >= SubList.this.size)
122                         throw new NoSuchElementException();
123                     Object[] elementData = ArrayList.this.elementData;
124                     if (offset + i >= elementData.length)
125                         throw new ConcurrentModificationException();
126                     cursor = i + 1;
127                     return (E) elementData[offset + (lastRet = i)];
128                 }
129 
130                 public boolean hasPrevious() {
131                     return cursor != 0;
132                 }
133 
134                 @SuppressWarnings("unchecked")
135                 public E previous() {
136                     checkForComodification();
137                     int i = cursor - 1;
138                     if (i < 0)
139                         throw new NoSuchElementException();
140                     Object[] elementData = ArrayList.this.elementData;
141                     if (offset + i >= elementData.length)
142                         throw new ConcurrentModificationException();
143                     cursor = i;
144                     return (E) elementData[offset + (lastRet = i)];
145                 }
146 
147                 public int nextIndex() {
148                     return cursor;
149                 }
150 
151                 public int previousIndex() {
152                     return cursor - 1;
153                 }
154 
155                 public void remove() {
156                     if (lastRet < 0)
157                         throw new IllegalStateException();
158                     checkForComodification();
159 
160                     try {
161                         SubList.this.remove(lastRet);
162                         cursor = lastRet;
163                         lastRet = -1;
164                         expectedModCount = ArrayList.this.modCount;
165                     } catch (IndexOutOfBoundsException ex) {
166                         throw new ConcurrentModificationException();
167                     }
168                 }
169 
170                 public void set(E e) {
171                     if (lastRet < 0)
172                         throw new IllegalStateException();
173                     checkForComodification();
174 
175                     try {
176                         ArrayList.this.set(offset + lastRet, e);
177                     } catch (IndexOutOfBoundsException ex) {
178                         throw new ConcurrentModificationException();
179                     }
180                 }
181 
182                 public void add(E e) {
183                     checkForComodification();
184 
185                     try {
186                         int i = cursor;
187                         SubList.this.add(i, e);
188                         cursor = i + 1;
189                         lastRet = -1;
190                         expectedModCount = ArrayList.this.modCount;
191                     } catch (IndexOutOfBoundsException ex) {
192                         throw new ConcurrentModificationException();
193                     }
194                 }
195 
196                 final void checkForComodification() {
197                     if (expectedModCount != ArrayList.this.modCount)
198                         throw new ConcurrentModificationException();
199                 }
200             };
201         }
202 
203         public List<E> subList(int fromIndex, int toIndex) {
204             subListRangeCheck(fromIndex, toIndex, size);
205             return new SubList(this, offset, fromIndex, toIndex);
206         }
207 
208         private void rangeCheck(int index) {
209             if (index < 0 || index >= this.size)
210                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
211         }
212 
213         private void rangeCheckForAdd(int index) {
214             if (index < 0 || index > this.size)
215                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
216         }
217 
218         private String outOfBoundsMsg(int index) {
219             return "Index: "+index+", Size: "+this.size;
220         }
221 
222         private void checkForComodification() {
223             if (ArrayList.this.modCount != this.modCount)
224                 throw new ConcurrentModificationException();
225         }
226     }
View Code

-------------------------------------------------------------------------------

java.util.ArrayList系列文章                                                                

java.util.ArrayList<E>(1)  java.util.ArrayList<E>(2)  java.util.ArrayList<E>(3)

java.util.ArrayList<E>(4)  java.util.ArrayList<E>(5)  java.util.ArrayList<E>(6)

相关知识                                                                                              

java.util.Collection<E>   java.util.AbstractCollection<E>   java.util.List<E>

java.util.AbstractList<E>   java.util.Iterator<E>   java.util.ListIterator<E>

Java中的标记接口   迭代器模式   Java中的深拷贝和浅拷贝  java.util.Arrays

 

posted @ 2017-02-07 21:02  火爆泡菜  阅读(362)  评论(0编辑  收藏  举报