标签:style blog class code java tar
ArrayList是List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。
每个 ArrayList 实例都有一个容量(capacity)。该容量是指用来存储列表元素的数组的大小。它大于或等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。注意,此实现不是同步的。
1 |
private
transient Object[] elementData; |
1 |
int array1[]={ 1 , 2 , 3 }; //定义一个数组长度为3的整形数组,此时数组的三个元素分别为1,2,3 |
1
2
3
4
5
6
7 |
int
array1[]={ 1 , 2 , 3 }; int array2[]= new
int [ 4 ]; for ( int
i= 0 ;i<array1.length;i++){ array2[i]=array1[i]; } array2[ 3 ]= 4 ; array1=array2; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
public ArrayList( int
initialCapacity) { super (); if
(initialCapacity < 0 ) throw
new IllegalArgumentException( "Illegal Capacity: "
+ initialCapacity); this .elementData = new
Object[initialCapacity]; } public
ArrayList() { this ( 10 ); } public
ArrayList(Collection<? extends
E> c) { elementData = c.toArray(); size = elementData.length; if
(elementData.getClass() != Object[]. class ) elementData = Arrays.copyOf(elementData, size, Object[]. class ); } |
1
2
3
4
5
6
7
8
9
10
11 |
public void ensureCapacity( int
minCapacity) { modCount++; //Fast-Fail机制(具体机制本文章中专门有说的) int
oldCapacity = elementData.length; if
(minCapacity > oldCapacity) { Object oldData[] = elementData; int
newCapacity = (oldCapacity * 3 ) / 2
+ 1 ; if
(newCapacity < minCapacity) newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); } } |
1
2
3
4
5 |
public boolean add(E e) { ensureCapacity(size + 1 ); //动态调整底层数组的容量 elementData[size++] = e; //将元素添加到列表尾部,列表大小加1 return
true ; //返回true,添加成功 } |
1
2
3
4
5
6
7
8 |
public void add( int index, E element) { if
(index > size || index < 0 ) // 首先检查index是否合法,要保证不能大于列表的实际长度,且index不能为负数,如果不满足就抛出异常 throw
new IndexOutOfBoundsException( "Index: "
+ index + ", Size: "
+ size); ensureCapacity(size + 1 ); // 添加元素的操作都要动态的调整底层数组的容量 System.arraycopy(elementData, index, elementData, index + 1 , size - index); //调用System的数组拷贝方法 elementData[index] = element; // 设置新数组处index处的值为指定的元素 size++; // 列表长度加1 } |
1
2
3
4
5
6
7
8 |
public boolean addAll(Collection<? extends
E> c) { Object[] a = c.toArray(); int
numNew = a.length; ensureCapacity(size + numNew); System.arraycopy(a, 0 , elementData, size, numNew); size += numNew; return
numNew != 0 ; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
public boolean addAll( int
index, Collection<? extends
E> c) { if
(index > size || index < 0 ) throw
new IndexOutOfBoundsException( "Index: "
+ index + ", Size: "
+ size); Object[] a = c.toArray(); int
numNew = a.length; ensureCapacity(size + numNew); // Increments modCount int
numMoved = size - index; if
(numMoved > 0 ) { System.arraycopy(elementData, index, elementData, index + numNew, numMoved); } System.arraycopy(a, 0 , elementData, index, numNew); size += numNew; return
numNew != 0 ; } |
1
2
3
4
5 |
public E get( int
index) { RangeCheck(index); // 检查index是否合法 return
(E) elementData[index]; // 返回指定index处的元素 } |
1
2
3
4
5 |
private
void RangeCheck( int
index) { //如果index不小于列表的元素个数,就抛出异常 if
(index >= size) throw
new IndexOutOfBoundsException( "Index: "
+ index + ", Size: "
+ size); } |
1
2
3
4
5
6
7
8
9
10
11
12
13 |
public E remove( int
index) { RangeCheck(index); // 检查index是否合法 modCount++; // Fail-Fast机制 E oldValue = (E) elementData[index]; // 获取待删除的元素 int
numMoved = size - index - 1 ; //移动元素个数 if
(numMoved > 0 ) { System.arraycopy(elementData, index + 1 , elementData, index, numMoved); //向前移动元素 } elementData[--size] = null ; //将原来size-1处的元素设置为空,列表大小-1 return
oldValue; //返回删除的元素 } |
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 |
// 删除首次出现的指定元素,元素存在返回 true,元素不存在返回false public
boolean remove(Object o) { if
(o == null ) { for
( int index = 0 ; index < size; index++) if
(elementData[index] == null ) { fastRemove(index); return
true ; } } else
{ for
( int index = 0 ; index < size; index++) if
(o.equals(elementData[index])) { fastRemove(index); return
true ; } } return
false ; } // ArrayList的私有方法,与remove(int index)方法类似 private
void fastRemove( int
index) { modCount++; // Fail-Fast机制 int
numMoved = size - index - 1 ; if
(numMoved > 0 ) { System.arraycopy(elementData, index + 1 , elementData, index, numMoved); } elementData[--size] = null ; } |
1
2
3
4
5
6
7
8
9 |
// 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素 protected
void removeRange( int
fromIndex, int
toIndex) { modCount++; int
numMoved = size - toIndex; System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved); int
newSize = size - (toIndex - fromIndex); while
(size != newSize) elementData[--size] = null ; } |
深入java集合学习2-ArrayList的实现原理,布布扣,bubuko.com
标签:style blog class code java tar
原文地址:http://www.cnblogs.com/javaee6/p/3714770.html