1、ArrayList主要成员变量及构造
public class ArrayList < E > extends AbstractList < E >
implements List < E > , RandomAccess , Cloneable , java. io. Serializable
{
private static final int DEFAULT_CAPACITY = 10 ;
private static final Object [ ] EMPTY_ELEMENTDATA = { } ;
private static final Object [ ] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = { } ;
transient Object [ ] elementData;
private int size;
public ArrayList ( int initialCapacity) {
if ( initialCapacity > 0 ) {
this . elementData = new Object [ initialCapacity] ;
} else if ( initialCapacity == 0 ) {
this . elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException ( "Illegal Capacity: " +
initialCapacity) ;
}
}
public ArrayList ( ) {
this . elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList ( Collection < ? extends E > c) {
Object [ ] a = c. toArray ( ) ;
if ( ( size = a. length) != 0 ) {
if ( c. getClass ( ) == ArrayList . class ) {
elementData = a;
} else {
elementData = Arrays . copyOf ( a, size, Object [ ] . class ) ;
}
} else {
elementData = EMPTY_ELEMENTDATA;
}
}
public void trimToSize ( ) {
modCount++ ;
if ( size < elementData. length) {
elementData = ( size == 0 )
? EMPTY_ELEMENTDATA
: Arrays . copyOf ( elementData, size) ;
}
}
public void ensureCapacity ( int minCapacity) {
int minExpand = ( elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
? 0
: DEFAULT_CAPACITY;
if ( minCapacity > minExpand) {
ensureExplicitCapacity ( minCapacity) ;
}
}
private static int calculateCapacity ( Object [ ] elementData, int minCapacity) {
if ( elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math . max ( DEFAULT_CAPACITY, minCapacity) ;
}
return minCapacity;
}
private void ensureCapacityInternal ( int minCapacity) {
ensureExplicitCapacity ( calculateCapacity ( elementData, minCapacity) ) ;
}
private void ensureExplicitCapacity ( int minCapacity) {
modCount++ ;
if ( minCapacity - elementData. length > 0 )
grow ( minCapacity) ;
}
private static final int MAX_ARRAY_SIZE = Integer . MAX_VALUE - 8 ;
private void grow ( int minCapacity) {
int oldCapacity = elementData. length;
int newCapacity = oldCapacity + ( oldCapacity >> 1 ) ;
if ( newCapacity - minCapacity < 0 )
newCapacity = minCapacity;
if ( newCapacity - MAX_ARRAY_SIZE > 0 )
newCapacity = hugeCapacity ( minCapacity) ;
elementData = Arrays . copyOf ( elementData, newCapacity) ;
}
private static int hugeCapacity ( int minCapacity) {
if ( minCapacity < 0 )
throw new OutOfMemoryError ( ) ;
return ( minCapacity > MAX_ARRAY_SIZE) ?
Integer . MAX_VALUE :
MAX_ARRAY_SIZE;
}
public Object clone ( ) {
try {
ArrayList < ? > v = ( ArrayList < ? > ) super . clone ( ) ;
v. elementData = Arrays . copyOf ( elementData, size) ;
v. modCount = 0 ;
return v;
} catch ( CloneNotSupportedException e) {
throw new InternalError ( e) ;
}
}
@SuppressWarnings ( "unchecked" )
E elementData ( int index) {
return ( E ) elementData[ index] ;
}
public E get ( int index) {
rangeCheck ( index) ;
return elementData ( index) ;
}
public E set ( int index, E element) {
rangeCheck ( index) ;
E oldValue = elementData ( index) ;
elementData[ index] = element;
return oldValue;
}
public boolean add ( E e) {
ensureCapacityInternal ( size + 1 ) ;
elementData[ size++ ] = e;
return true ;
}
public void add ( int index, E element) {
rangeCheckForAdd ( index) ;
ensureCapacityInternal ( size + 1 ) ;
System . arraycopy ( elementData, index, elementData, index + 1 ,
size - index) ;
elementData[ index] = element;
size++ ;
}
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 ;
}
private void fastRemove ( int index) {
modCount++ ;
int numMoved = size - index - 1 ;
if ( numMoved > 0 )
System . arraycopy ( elementData, index+ 1 , elementData, index,
numMoved) ;
elementData[ -- size] = null ;
}
public void clear ( ) {
modCount++ ;
for ( int i = 0 ; i < size; i++ )
elementData[ i] = null ;
size = 0 ;
}
protected void removeRange ( int fromIndex, int toIndex) {
modCount++ ;
int numMoved = size - toIndex;
System . arraycopy ( elementData, toIndex, elementData, fromIndex,
numMoved) ;
int newSize = size - ( toIndex- fromIndex) ;
for ( int i = newSize; i < size; i++ ) {
elementData[ i] = null ;
}
size = newSize;
}
private void rangeCheck ( int index) {
if ( index >= size)
throw new IndexOutOfBoundsException ( outOfBoundsMsg ( index) ) ;
}
private void rangeCheckForAdd ( int index) {
if ( index > size || index < 0 )
throw new IndexOutOfBoundsException ( outOfBoundsMsg ( index) ) ;
}
. . . . . . . . . . . . 略. . . . . . . . . . . . . . . .
}
2、add添加内容
public boolean add ( E e) {
ensureCapacityInternal ( size + 1 ) ;
elementData[ size++ ] = e;
return true ;
}
private void ensureCapacityInternal ( int minCapacity) {
ensureExplicitCapacity ( calculateCapacity ( elementData, minCapacity) ) ;
}
private static int calculateCapacity ( Object [ ] elementData, int minCapacity) {
if ( elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math . max ( DEFAULT_CAPACITY, minCapacity) ;
}
return minCapacity;
}
private void ensureExplicitCapacity ( int minCapacity) {
modCount++ ;
if ( minCapacity - elementData. length > 0 )
grow ( minCapacity) ;
}
private void grow ( int minCapacity) {
int oldCapacity = elementData. length;
int newCapacity = oldCapacity + ( oldCapacity >> 1 ) ;
if ( newCapacity - minCapacity < 0 )
newCapacity = minCapacity;
if ( newCapacity - MAX_ARRAY_SIZE > 0 )
newCapacity = hugeCapacity ( minCapacity) ;
elementData = Arrays . copyOf ( elementData, newCapacity) ;
}
3、get通过索引查询数据
public E get ( int index) {
rangeCheck ( index) ;
return elementData ( index) ;
}
private void rangeCheck ( int index) {
if ( index >= size)
throw new IndexOutOfBoundsException ( outOfBoundsMsg ( index) ) ;
}
E elementData ( int index) {
return ( E ) elementData[ index] ;
}
4、set通过索引修改指定数组下标的数据
public E set ( int index, E element) {
rangeCheck ( index) ;
E oldValue = elementData ( index) ;
elementData[ index] = element;
return oldValue;
}
private void rangeCheck ( int index) {
if ( index >= size)
throw new IndexOutOfBoundsException ( outOfBoundsMsg ( index) ) ;
}
E elementData ( int index) {
return ( E ) elementData[ index] ;
}
5、remove删除内容
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 ;
}
private void fastRemove ( int index) {
modCount++ ;
int numMoved = size - index - 1 ;
if ( numMoved > 0 )
System . arraycopy ( elementData, index+ 1 , elementData, index,
numMoved) ;
elementData[ -- size] = null ;
}
6、clear清空全部内容
public void clear ( ) {
modCount++ ;
for ( int i = 0 ; i < size; i++ )
elementData[ i] = null ;
size = 0 ;
}