JDK源码ArrayList

引用博文链接 : http://www.cnblogs.com/leskang/p/6019887.html

构造器:

 1 public class ArrayList<E> extends AbstractList<E>
 2         implements List<E>, RandomAccess, Cloneable, java.io.Serializable
 3 {
 4     private static final long serialVersionUID = 8683452581122892189L;
 5 
 6     //默认初始大小:10
 7     private static final int DEFAULT_CAPACITY = 10;
//记录列表结构性修改次数,next,add,remove,previous,set操作
8 protected transient int modCount = 0; 9 //空数组 10 private static final Object[] EMPTY_ELEMENTDATA = {}; 11 12 //默认大小空数组 13 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 14 15 transient Object[] elementData; // non-private to simplify nested class access 16 17 private int size; 18 19 //构建一个大小指定的空列表 20 public ArrayList(int initialCapacity) { 21 if (initialCapacity > 0) { 22 this.elementData = new Object[initialCapacity]; 23 } else if (initialCapacity == 0) { 24 this.elementData = EMPTY_ELEMENTDATA; 25 } else { 26 throw new IllegalArgumentException("Illegal Capacity: "+ 27 initialCapacity); 28 } 29 } 30 31 //构建一个默认大小(10)的空列表 32 public ArrayList() { 33 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; 34 } 35 44 //构建一个包含集合元素的列表,元素排列顺序是按集合的迭代器返回的顺序 45 public ArrayList(Collection<? extends E> c) { 46 elementData = c.toArray(); 47 if ((size = elementData.length) != 0) { 48 // c.toArray might (incorrectly) not return Object[] (see 6260652) 49 if (elementData.getClass() != Object[].class) 50 elementData = Arrays.copyOf(elementData, size, Object[].class); 51 } else { 52 // replace with empty array. 53 this.elementData = EMPTY_ELEMENTDATA; 54 } 55 } 56 ...... 57 }

boolean add(E e):

 1     public boolean add(E e) {
 2         ensureCapacityInternal(size + 1);  // Increments modCount!! // 添加之前检查数组容量,size+1表示接下来要有的容量
 3         elementData[size++] = e;  
 4         return true;
 5     }
 6     
 7     private void ensureCapacityInternal(int minCapacity) {
 8         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//如果elementData 为空集合
 9             minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);//将传入的minCapacity和默认值10比较,选出较大的
10         }
11 
12         ensureExplicitCapacity(minCapacity);
13     }
14     
15     private void ensureExplicitCapacity(int minCapacity) {
16         modCount++;
17 
18         // overflow-conscious code
19         if (minCapacity - elementData.length > 0)//如果最小容量大于列表现有的长度,则扩容,否则容量不变
20             grow(minCapacity);
21     }
22     
23     private void grow(int minCapacity) {
24         // overflow-conscious code
25         int oldCapacity = elementData.length;
26         int newCapacity = oldCapacity + (oldCapacity >> 1);//>> : 右移运算符,num >> 1,相当于num除以2,此处扩容按照原容量大小的一半扩容
27         if (newCapacity - minCapacity < 0)
28             newCapacity = minCapacity;
29         if (newCapacity - MAX_ARRAY_SIZE > 0)//如果新容量大于integer的最大值
30             newCapacity = hugeCapacity(minCapacity);
31         // minCapacity is usually close to size, so this is a win:
32         elementData = Arrays.copyOf(elementData, newCapacity); //将原有元素拷贝到扩容后的新数组中
33     }
34     
35      private static int hugeCapacity(int minCapacity) {
36         if (minCapacity < 0) // overflow
37             throw new OutOfMemoryError();
38         return (minCapacity > MAX_ARRAY_SIZE) ?   //如果新容量大于(integer的最大值-8),最大容量就是integer的最大值
39             Integer.MAX_VALUE :
40             MAX_ARRAY_SIZE;
41     }

总结:ArrayList列表的最大容量就integer的最大值

 

 E remove(int index):

 1   public E remove(int index) {
 2         rangeCheck(index);
 3 
 4         modCount++;
 5         E oldValue = elementData(index);//要移除位置上的元素
 6 
 7         int numMoved = size - index - 1;
 8         if (numMoved > 0)
 9             System.arraycopy(elementData, index+1, elementData, index,
10                              numMoved);  
11         elementData[--size] = null; // clear to let GC do its work 将最后一个元素置null回收
12 
13         return oldValue;
14     }
15 
16     //System类的方法,从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
17     从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。
18     源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。
19     即目标数组的后半段被原数组的后半段(去掉要移除部分)
20     public static native void arraycopy(Object src,  int  srcPos,
21                                         Object dest, int destPos,
22                                         int length);

add(int index, E element):

1  public void add(int index, E element) {
2         rangeCheckForAdd(index);
3 
4         ensureCapacityInternal(size + 1);  // Increments modCount!!
5         System.arraycopy(elementData, index, elementData, index + 1,
6                          size - index);
7         elementData[index] = element;//index的位置置为element
8         size++;
9     }

总结:ArrayList增删比较慢

addAll:
1      public boolean addAll(Collection<? extends E> c) {
2          Object[] a = c.toArray();
3          int numNew = a.length;
4          ensureCapacityInternal(size + numNew);  // Increments modCount
5          System.arraycopy(a, 0, elementData, size, numNew);
6          size += numNew;
7          return numNew != 0;
8      }
 1     public boolean addAll(int index, Collection<? extends E> c) {
 2         rangeCheckForAdd(index);
 3 
 4         Object[] a = c.toArray();
 5         int numNew = a.length;
 6         ensureCapacityInternal(size + numNew);  // Increments modCount
 7 
 8         int numMoved = size - index;
 9         if (numMoved > 0) //如果是列表中间位置插入,先将列表index到index+numNew之间的位置空出来
10             System.arraycopy(elementData, index, elementData, index + numNew,
11                              numMoved);
12 
13         System.arraycopy(a, 0, elementData, index, numNew);//将新添加的元素添加到空出的位置,这里省了一个numMoved==0的判断
14         size += numNew;
15         return numNew != 0;
16     }
17 
18     //检查脚标是否越界
19     private void rangeCheckForAdd(int index) {
20         if (index > size || index < 0)
21             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
22     }
boolean remove(Object o):
 1  public boolean remove(Object o) {
 2         if (o == null) {
 3             for (int index = 0; index < size; index++)
 4                 if (elementData[index] == null) {
 5                     fastRemove(index);
 6                     return true;
 7                 }
 8         } else {
 9             for (int index = 0; index < size; index++)
10                 if (o.equals(elementData[index])) {
11                     fastRemove(index);
12                     return true;
13                 }
14         }
15         return false;
16     }
17 
18     //此方法和remove类似,没有检查索引是否越界
19     private void fastRemove(int index) {
20         modCount++;
21         int numMoved = size - index - 1;
22         if (numMoved > 0)
23             System.arraycopy(elementData, index+1, elementData, index,
24                              numMoved);
25         elementData[--size] = null; // clear to let GC do its work
26     }

总结:先判断是否是null,如果是要单独操作;否则通过逐个比较元素来判断要移除元素的位置,再通过类似于remove的方法移除元素

E set(int index, E element):修改
1     public E set(int index, E element) {
2         rangeCheck(index);
3 
4         E oldValue = elementData(index);
5         elementData[index] = element;
6         return oldValue;
7     }

总结:直接替换指定位置的元素

E get(int index):
 1     public E get(int index) {
 2         rangeCheck(index);
 3 
 4         return elementData(index);
 5     }
 6 
 7     @SuppressWarnings("unchecked")
 8     E elementData(int index) {
 9         return (E) elementData[index];
10     }

总结:根据数组脚标拿到元素,所以速度快

其他一些方法 :

  1     //修剪列表的容量到最小值,
  2     public void trimToSize() {
  3         modCount++;
  4         if (size < elementData.length) {
  5             elementData = (size == 0) //如果size==0,容量是默认值10,
  6               ? EMPTY_ELEMENTDATA
  7               : Arrays.copyOf(elementData, size);//否则将数组拷贝到一个新的数组(长度为size)
  8         }
  9     }
 10     
 11     //确保列表容量增加到minCapacity
 12     public void ensureCapacity(int minCapacity) {
 13         //如果列表为DEFAULTCAPACITY_EMPTY_ELEMENTDATA,即空列表,则列表容量为默认值10,
 14         否则为0
 15         int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
 16             // any size if not default element table
 17             ? 0
 18             // larger than default for default empty table. It's already
 19             // supposed to be at default size.
 20             : DEFAULT_CAPACITY;
 21 
 22         if (minCapacity > minExpand) {
 23             ensureExplicitCapacity(minCapacity);
 24         }
 25     }
 26 
 27     //判断列表元素个数是否为0
 28     public boolean isEmpty() {
 29         return size == 0;
 30     }
 31 
 32     public boolean contains(Object o) {
 33         return indexOf(o) >= 0;
 34     }
 35 
 36     //判断元素o在列表里存在的位置,如果存在返回index,如果不存在返回-1
 37     public int indexOf(Object o) {
 38         if (o == null) {
 39             for (int i = 0; i < size; i++)
 40                 if (elementData[i]==null)
 41                     return i;
 42         } else {
 43             for (int i = 0; i < size; i++)
 44                 if (o.equals(elementData[i]))
 45                     return i;
 46         }
 47         return -1;
 48     }
 49 
 50     //判断元素o最后一次出现的位置,如果存在返回index,如果不存在返回-1
 51     public int lastIndexOf(Object o) {
 52         if (o == null) {
 53             for (int i = size-1; i >= 0; i--)//从列表尾部开始遍历,第一次出现
 54                 if (elementData[i]==null)
 55                     return i;
 56         } else {
 57             for (int i = size-1; i >= 0; i--)
 58                 if (o.equals(elementData[i]))
 59                     return i;
 60         }
 61         return -1;
 62     }
 63 
 64     //克隆浅表副本 
 65     public Object clone() {
 66         try {
 67             ArrayList<?> v = (ArrayList<?>) super.clone();
 68             v.elementData = Arrays.copyOf(elementData, size);
 69             v.modCount = 0;
 70             return v;
 71         } catch (CloneNotSupportedException e) {
 72             // this shouldn't happen, since we are Cloneable
 73             throw new InternalError(e);
 74         }
 75     }
 76 
 77     // 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。 
 78       由于此列表不维护对返回数组的任何引用,因而它将是“安全的”。
 79      (换句话说,此方法必须分配一个新的数组)。因此,调用者可以自由地修改返回的数组。 
 80       此方法担当基于数组的 API 和基于 collection 的 API 之间的桥梁。
 81     public Object[] toArray() {
 82         return Arrays.copyOf(elementData, size);
 83     }
 84   
 85     public <T> T[] toArray(T[] a) {
 86         if (a.length < size)
 87             // Make a new array of a's runtime type, but my contents:
 88             return (T[]) Arrays.copyOf(elementData, size, a.getClass());
 89         System.arraycopy(elementData, 0, a, 0, size);
 90         if (a.length > size)
 91             a[size] = null;
 92         return a;
 93     }
 94 
 95    //清空列表
 96     public void clear() {
 97         modCount++;
 98 
 99         // clear to let GC do its work
100         for (int i = 0; i < size; i++)
101             elementData[i] = null;
102 
103         size = 0;
104     }
105 
106     //删除fromIndex(包含)到toIndex(不包含)之间的元素
107     protected void removeRange(int fromIndex, int toIndex) {
108         modCount++;
109         int numMoved = size - toIndex;
110         System.arraycopy(elementData, toIndex, elementData, fromIndex,
111                          numMoved);
112 
113         // clear to let GC do its work
114         int newSize = size - (toIndex-fromIndex);
115         for (int i = newSize; i < size; i++) {
116             elementData[i] = null;
117         }
118         size = newSize;
119     }
120 
121     //检测脚标是否越界
122     private void rangeCheck(int index) {
123         if (index >= size)
124             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
125     }
126 
127     private String outOfBoundsMsg(int index) {
128         return "Index: "+index+", Size: "+size;
129     }
130 
131      */
132     //移除与集合c里相同的元素 
133     public boolean removeAll(Collection<?> c) {
134         Objects.requireNonNull(c);
135         return batchRemove(c, false);
136     }
137     
138     //保留与集合c里相同的元素    
139     public boolean retainAll(Collection<?> c) {
140         Objects.requireNonNull(c);
141         return batchRemove(c, true);
142     }
143 
144     private boolean batchRemove(Collection<?> c, boolean complement) {
145         final Object[] elementData = this.elementData;
146         int r = 0, w = 0;
147         boolean modified = false;
148         try {
149             for (; r < size; r++)
150                 if (c.contains(elementData[r]) == complement)
151                     elementData[w++] = elementData[r];
152         } finally {
153             // Preserve behavioral compatibility with AbstractCollection,
154             // even if c.contains() throws.
155             if (r != size) {
156                 System.arraycopy(elementData, r,
157                                  elementData, w,
158                                  size - r);
159                 w += size - r;
160             }
161             if (w != size) {
162                 // clear to let GC do its work
163                 for (int i = w; i < size; i++)
164                     elementData[i] = null;
165                 modCount += size - w;
166                 size = w;
167                 modified = true;
168             }
169         }
170         return modified;
171     }
172 
173     //序列化列表
174     private void writeObject(java.io.ObjectOutputStream s)
175         throws java.io.IOException{
176         // Write out element count, and any hidden stuff
177         int expectedModCount = modCount;
178         s.defaultWriteObject();
179 
180         // Write out size as capacity for behavioural compatibility with clone()
181         s.writeInt(size);
182 
183         // Write out all elements in the proper order.
184         for (int i=0; i<size; i++) {
185             s.writeObject(elementData[i]);    //ArrayList的设计者将elementData设计为transient,
186             然后在writeObject方法中手动将其序列化,并且只序列化了实际存储的那些元素,而不是整个数组。
187         }
188 
189         if (modCount != expectedModCount) {
190             throw new ConcurrentModificationException();
191         }
192     }
193 
194     //反序列化列表 
195     private void readObject(java.io.ObjectInputStream s)
196         throws java.io.IOException, ClassNotFoundException {
197         elementData = EMPTY_ELEMENTDATA;
198 
199         // Read in size, and any hidden stuff
200         s.defaultReadObject();
201 
202         // Read in capacity
203         s.readInt(); // ignored
204 
205         if (size > 0) {
206             // be like clone(), allocate array based upon size not capacity
207             ensureCapacityInternal(size);
208 
209             Object[] a = elementData;
210             // Read in all elements in the proper order.
211             for (int i=0; i<size; i++) {
212                 a[i] = s.readObject();
213             }
214         }
215     }

Iterator<E> iterator(),ListIterator<E> listIterator(int index) 与LinkedList类似:可参考  https://www.cnblogs.com/sqy123/p/9272666.html

还有Spliterator 

  1     public Iterator<E> iterator() {
  2         return new Itr();
  3     }
  4 
  5     private class Itr implements Iterator<E> {
  6         int cursor;       // index of next element to return
  7         int lastRet = -1; // index of last element returned; -1 if no such
  8         int expectedModCount = modCount;
  9 
 10         public boolean hasNext() {
 11             return cursor != size;
 12         }
 13 
 14         @SuppressWarnings("unchecked")
 15         public E next() {
 16             checkForComodification();
 17             int i = cursor;
 18             if (i >= size)
 19                 throw new NoSuchElementException();
 20             Object[] elementData = ArrayList.this.elementData;
 21             if (i >= elementData.length)
 22                 throw new ConcurrentModificationException();
 23             cursor = i + 1;
 24             return (E) elementData[lastRet = i];
 25         }
 26 
 27         public void remove() {
 28             if (lastRet < 0)
 29                 throw new IllegalStateException();
 30             checkForComodification();
 31 
 32             try {
 33                 ArrayList.this.remove(lastRet);
 34                 cursor = lastRet;
 35                 lastRet = -1;
 36                 expectedModCount = modCount;
 37             } catch (IndexOutOfBoundsException ex) {
 38                 throw new ConcurrentModificationException();
 39             }
 40         }
 41 
 42         //外部结构修改则迭代快速失败fast-fails
 43         @Override
 44         @SuppressWarnings("unchecked")
 45         public void forEachRemaining(Consumer<? super E> consumer) {
 46             Objects.requireNonNull(consumer);
 47             final int size = ArrayList.this.size;
 48             int i = cursor;
 49             if (i >= size) {
 50                 return;
 51             }
 52             final Object[] elementData = ArrayList.this.elementData;
 53             if (i >= elementData.length) {
 54                 throw new ConcurrentModificationException();
 55             }
 56             while (i != size && modCount == expectedModCount) {
 57                 consumer.accept((E) elementData[i++]);
 58             }
 59             // update once at end of iteration to reduce heap write traffic
 60             cursor = i;
 61             lastRet = i - 1;
 62             checkForComodification();
 63         }
 64 
 65         final void checkForComodification() {
 66             if (modCount != expectedModCount)
 67                 throw new ConcurrentModificationException();
 68         }
 69     }
 70 
 71      //返回此列表中的元素的列表迭代器(按适当顺序:从列表中指定位置开始)
 72     public ListIterator<E> listIterator(int index) {
 73         if (index < 0 || index > size)
 74             throw new IndexOutOfBoundsException("Index: "+index);
 75         return new ListItr(index); //调用内部类ListItr的匿名对象
 76     }
 77 
 78     public ListIterator<E> listIterator() {
 79         return new ListItr(0);
 80     }
 81     
 82     private class ListItr extends Itr implements ListIterator<E> {
 83         ListItr(int index) {
 84             super();
 85             cursor = index;
 86         }
 87 
 88         public boolean hasPrevious() {
 89             return cursor != 0;
 90         }
 91 
 92         public int nextIndex() {
 93             return cursor;
 94         }
 95 
 96         public int previousIndex() {
 97             return cursor - 1;
 98         }
 99 
100         @SuppressWarnings("unchecked")
101         public E previous() {
102             checkForComodification();
103             int i = cursor - 1;
104             if (i < 0)
105                 throw new NoSuchElementException();
106             Object[] elementData = ArrayList.this.elementData;
107             if (i >= elementData.length)
108                 throw new ConcurrentModificationException();
109             cursor = i;
110             return (E) elementData[lastRet = i];
111         }
112 
113         public void set(E e) {
114             if (lastRet < 0)
115                 throw new IllegalStateException();
116             checkForComodification();
117 
118             try {
119                 ArrayList.this.set(lastRet, e);
120             } catch (IndexOutOfBoundsException ex) {
121                 throw new ConcurrentModificationException();
122             }
123         }
124 
125         public void add(E e) {
126             checkForComodification();
127 
128             try {
129                 int i = cursor;
130                 ArrayList.this.add(i, e);
131                 cursor = i + 1;
132                 lastRet = -1;
133                 expectedModCount = modCount;
134             } catch (IndexOutOfBoundsException ex) {
135                 throw new ConcurrentModificationException();
136             }
137         }
138     }
 List<E> subList(int fromIndex, int toIndex):

对原来的list和返回的sublist做的“非结构性修改”(non-structural changes),都会影响到彼此对方。

   所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。

博文链接:https://blog.csdn.net/leisurelen/article/details/51174614
  1     //获取子列表(包括fromIndex,不包括toIndex)
  2     public List<E> subList(int fromIndex, int toIndex) {
  3         subListRangeCheck(fromIndex, toIndex, size);
  4         return new SubList(this, 0, fromIndex, toIndex);
  5     }
  6 
  7     static void subListRangeCheck(int fromIndex, int toIndex, int size) {
  8         if (fromIndex < 0)
  9             throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
 10         if (toIndex > size)
 11             throw new IndexOutOfBoundsException("toIndex = " + toIndex);
 12         if (fromIndex > toIndex)
 13             throw new IllegalArgumentException("fromIndex(" + fromIndex +
 14                                                ") > toIndex(" + toIndex + ")");
 15     }
 16 
 17     private class SubList extends AbstractList<E> implements RandomAccess {
 18         private final AbstractList<E> parent;
 19         private final int parentOffset;
 20         private final int offset;
 21         int size;
 22 
 23         SubList(AbstractList<E> parent,
 24                 int offset, int fromIndex, int toIndex) {
 25             this.parent = parent;
 26             this.parentOffset = fromIndex;
 27             this.offset = offset + fromIndex;
 28             this.size = toIndex - fromIndex;
 29             this.modCount = ArrayList.this.modCount;
 30         }
 31 
 32         public E set(int index, E e) {
 33             rangeCheck(index);
 34             checkForComodification();
 35             E oldValue = ArrayList.this.elementData(offset + index);
 36             ArrayList.this.elementData[offset + index] = e;
 37             return oldValue;
 38         }
 39 
 40         public E get(int index) {
 41             rangeCheck(index);
 42             checkForComodification();
 43             return ArrayList.this.elementData(offset + index);
 44         }
 45 
 46         public int size() {
 47             checkForComodification();
 48             return this.size;
 49         }
 50 
 51         public void add(int index, E e) {
 52             rangeCheckForAdd(index);
 53             checkForComodification();
 54             parent.add(parentOffset + index, e);
 55             this.modCount = parent.modCount;
 56             this.size++;
 57         }
 58 
 59         public E remove(int index) {
 60             rangeCheck(index);
 61             checkForComodification();
 62             E result = parent.remove(parentOffset + index);
 63             this.modCount = parent.modCount;
 64             this.size--;
 65             return result;
 66         }
 67 
 68         protected void removeRange(int fromIndex, int toIndex) {
 69             checkForComodification();
 70             parent.removeRange(parentOffset + fromIndex,
 71                                parentOffset + toIndex);
 72             this.modCount = parent.modCount;
 73             this.size -= toIndex - fromIndex;
 74         }
 75 
 76         public boolean addAll(Collection<? extends E> c) {
 77             return addAll(this.size, c);
 78         }
 79 
 80         public boolean addAll(int index, Collection<? extends E> c) {
 81             rangeCheckForAdd(index);
 82             int cSize = c.size();
 83             if (cSize==0)
 84                 return false;
 85 
 86             checkForComodification();
 87             parent.addAll(parentOffset + index, c);
 88             this.modCount = parent.modCount;
 89             this.size += cSize;
 90             return true;
 91         }
 92 
 93         public Iterator<E> iterator() {
 94             return listIterator();
 95         }
 96 
 97         public ListIterator<E> listIterator(final int index) {
 98             checkForComodification();
 99             rangeCheckForAdd(index);
100             final int offset = this.offset;
101 
102             return new ListIterator<E>() {
103                 int cursor = index;
104                 int lastRet = -1;
105                 int expectedModCount = ArrayList.this.modCount;
106 
107                 public boolean hasNext() {
108                     return cursor != SubList.this.size;
109                 }
110 
111                 @SuppressWarnings("unchecked")
112                 public E next() {
113                     checkForComodification();
114                     int i = cursor;
115                     if (i >= SubList.this.size)
116                         throw new NoSuchElementException();
117                     Object[] elementData = ArrayList.this.elementData;
118                     if (offset + i >= elementData.length)
119                         throw new ConcurrentModificationException();
120                     cursor = i + 1;
121                     return (E) elementData[offset + (lastRet = i)];
122                 }
123 
124                 public boolean hasPrevious() {
125                     return cursor != 0;
126                 }
127 
128                 @SuppressWarnings("unchecked")
129                 public E previous() {
130                     checkForComodification();
131                     int i = cursor - 1;
132                     if (i < 0)
133                         throw new NoSuchElementException();
134                     Object[] elementData = ArrayList.this.elementData;
135                     if (offset + i >= elementData.length)
136                         throw new ConcurrentModificationException();
137                     cursor = i;
138                     return (E) elementData[offset + (lastRet = i)];
139                 }
140 
141                 @SuppressWarnings("unchecked")
142                 public void forEachRemaining(Consumer<? super E> consumer) {
143                     Objects.requireNonNull(consumer);
144                     final int size = SubList.this.size;
145                     int i = cursor;
146                     if (i >= size) {
147                         return;
148                     }
149                     final Object[] elementData = ArrayList.this.elementData;
150                     if (offset + i >= elementData.length) {
151                         throw new ConcurrentModificationException();
152                     }
153                     while (i != size && modCount == expectedModCount) {
154                         consumer.accept((E) elementData[offset + (i++)]);
155                     }
156                     // update once at end of iteration to reduce heap write traffic
157                     lastRet = cursor = i;
158                     checkForComodification();
159                 }
160 
161                 public int nextIndex() {
162                     return cursor;
163                 }
164 
165                 public int previousIndex() {
166                     return cursor - 1;
167                 }
168 
169                 public void remove() {
170                     if (lastRet < 0)
171                         throw new IllegalStateException();
172                     checkForComodification();
173 
174                     try {
175                         SubList.this.remove(lastRet);
176                         cursor = lastRet;
177                         lastRet = -1;
178                         expectedModCount = ArrayList.this.modCount;
179                     } catch (IndexOutOfBoundsException ex) {
180                         throw new ConcurrentModificationException();
181                     }
182                 }
183 
184                 public void set(E e) {
185                     if (lastRet < 0)
186                         throw new IllegalStateException();
187                     checkForComodification();
188 
189                     try {
190                         ArrayList.this.set(offset + lastRet, e);
191                     } catch (IndexOutOfBoundsException ex) {
192                         throw new ConcurrentModificationException();
193                     }
194                 }
195 
196                 public void add(E e) {
197                     checkForComodification();
198 
199                     try {
200                         int i = cursor;
201                         SubList.this.add(i, e);
202                         cursor = i + 1;
203                         lastRet = -1;
204                         expectedModCount = ArrayList.this.modCount;
205                     } catch (IndexOutOfBoundsException ex) {
206                         throw new ConcurrentModificationException();
207                     }
208                 }
209 
210                 final void checkForComodification() {
211                     if (expectedModCount != ArrayList.this.modCount)
212                         throw new ConcurrentModificationException();
213                 }
214             };
215         }
216 
217         public List<E> subList(int fromIndex, int toIndex) {
218             subListRangeCheck(fromIndex, toIndex, size);
219             return new SubList(this, offset, fromIndex, toIndex);
220         }
221 
222         private void rangeCheck(int index) {
223             if (index < 0 || index >= this.size)
224                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
225         }
226 
227         private void rangeCheckForAdd(int index) {
228             if (index < 0 || index > this.size)
229                 throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
230         }
231 
232         private String outOfBoundsMsg(int index) {
233             return "Index: "+index+", Size: "+this.size;
234         }
235 
236         private void checkForComodification() {
237             if (ArrayList.this.modCount != this.modCount)
238                 throw new ConcurrentModificationException();
239         }
240 
241         public Spliterator<E> spliterator() {
242             checkForComodification();
243             return new ArrayListSpliterator<E>(ArrayList.this, offset,
244                                                offset + this.size, this.modCount);
245         }
246     }
void sort(Comparator<? super E> c):比较
 1   @Override
 2     @SuppressWarnings("unchecked")
 3     //使用自定义比较器进行排序
 4     public void sort(Comparator<? super E> c) {
 5         final int expectedModCount = modCount;
 6         Arrays.sort((E[]) elementData, 0, size, c);
 7         if (modCount != expectedModCount) {
 8             throw new ConcurrentModificationException();
 9         }
10         modCount++;
11     }

demo:

 1     public static void main(String[] args) {
 2         ArrayList<Integer> list = new ArrayList<>();
 3         list.add(1);
 4         list.add(3);
 5         list.add(7);
 6         list.add(0);
 7 
 8         Comparator c = new Comparator<Integer>() {
 9             @Override
10             public int compare(Integer o1, Integer o2) {
11                 // TODO Auto-generated method stub
12                 if((int)o1<(int)o2)
13                     return 1;
14                     //注意!!返回值必须是一对相反数,否则无效。jdk1.7以后就是这样。
15                     //        else return 0; //无效
16                 else return -1;
17             }
18         };
19         System.out.println("原始:"+list);
20         list.sort(c);
21         System.out.println("排序后:"+list);
22     }

结果:

1 原始:[1, 3, 7, 0]
2 排序后:[7, 3, 1, 0]

void forEach(Consumer<? super E> action) :

 1    @Override
 2     public void forEach(Consumer<? super E> action) {
 3         Objects.requireNonNull(action);
 4         final int expectedModCount = modCount;
 5         @SuppressWarnings("unchecked")
 6         final E[] elementData = (E[]) this.elementData;
 7         final int size = this.size;
 8         for (int i=0; modCount == expectedModCount && i < size; i++) {
 9             action.accept(elementData[i]);
10         }
11         if (modCount != expectedModCount) {
12             throw new ConcurrentModificationException();
13         }
14     }

demo:

 1 public static void main(String[] args) {
 2         ArrayList<Integer> list = new ArrayList<>();
 3         list.add(1);
 4         list.add(3);
 5         list.add(7);
 6         list.add(0);
 7         list.forEach(new Consumer<Integer>() {
 8 
 9                  @Override
10                  public void accept(Integer str) {
11                      if (str > 3)
12                          System.out.println(str);
13                  }
14              }
15         );
16         System.out.println(list);
17     }

结果:

7
[1, 3, 7, 0]

也可以写成lamb表达式,这样更简洁,

 1  public static void main(String[] args) {
 2         ArrayList<Integer> list = new ArrayList<>();
 3         list.add(1);
 4         list.add(3);
 5         list.add(7);
 6         list.add(0);
 7         list.forEach(str -> {
 8                 if (str > 3)
 9                     System.out.println(str);
10             }
11         );
12         System.out.println(list);
13     }

同理  void replaceAll(UnaryOperator<E> operator),boolean removeIf(Predicate<? super E> filter) 引用博文:https://www.cnblogs.com/CarpenterLee/p/6507161.html

 1  @Override
 2     @SuppressWarnings("unchecked")
 3     public void replaceAll(UnaryOperator<E> operator) {
 4         Objects.requireNonNull(operator);
 5         final int expectedModCount = modCount;
 6         final int size = this.size;
 7         for (int i=0; modCount == expectedModCount && i < size; i++) {
 8             elementData[i] = operator.apply((E) elementData[i]);
 9         }
10         if (modCount != expectedModCount) {
11             throw new ConcurrentModificationException();
12         }
13         modCount++;
14     }

猜你喜欢

转载自www.cnblogs.com/sqy123/p/9341027.html