<span style="color: #008000;">*/
<span style="color: #0000ff;">public <span style="color: #0000ff;">class ArrayListDemo <span style="color: #0000ff;">implements<span style="color: #000000;"> RandomAccess,Cloneable,Serializable{
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">final <span style="color: #0000ff;">int DEFAULT_SIZE = 10<span style="color: #000000;">;
<span style="color: #0000ff;">private<span style="color: #000000;"> Object[] elementData;
<span style="color: #0000ff;">private <span style="color: #0000ff;">int size = 0<span style="color: #000000;">;
ArrayListDemo() {
<span style="color: #0000ff;">this<span style="color: #000000;">(DEFAULT_SIZE);
}
ArrayListDemo(<span style="color: #0000ff;">int<span style="color: #000000;"> initialCapacity) {
<span style="color: #0000ff;">if (initialCapacity < 0<span style="color: #000000;">) {
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new IllegalArgumentException("初始化参数错误:" +<span style="color: #000000;"> initialCapacity);
} <span style="color: #0000ff;">else<span style="color: #000000;"> {
elementData = <span style="color: #0000ff;">new<span style="color: #000000;"> Object[initialCapacity];
}
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> add(E e) {
isCapacityEnough(size + 1<span style="color: #000000;">);
elementData[size++] =<span style="color: #000000;"> e;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">void add(<span style="color: #0000ff;">int<span style="color: #000000;"> index,E e) {
rangeCheckForAdd(index);
isCapacityEnough(size + 1<span style="color: #000000;">);
System.arraycopy(elementData,index,elementData,index + 1,size -<span style="color: #000000;"> index);
elementData[index] =<span style="color: #000000;"> e;
size++<span style="color: #000000;">;
}
<span style="color: #0000ff;">private <span style="color: #0000ff;">void rangeCheckForAdd(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
<span style="color: #0000ff;">if (index < 0 || index ><span style="color: #000000;"> size)
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new IndexOutOfBoundsException("下标越界:" +<span style="color: #000000;"> index);
}
<span style="color: #0000ff;">private <span style="color: #0000ff;">void isCapacityEnough(<span style="color: #0000ff;">int<span style="color: #000000;"> capacity) {
<span style="color: #008000;">//<span style="color: #008000;"> 溢出
<span style="color: #0000ff;">if (capacity < 0<span style="color: #000000;">)
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new<span style="color: #000000;"> OutOfMemoryError();
<span style="color: #008000;">//<span style="color: #008000;"> 需要扩容
<span style="color: #0000ff;">if (capacity - elementData.length > 0<span style="color: #000000;">)
grow(capacity);
}
<span style="color: #0000ff;">private <span style="color: #0000ff;">void grow(<span style="color: #0000ff;">int<span style="color: #000000;"> capacity) {
<span style="color: #0000ff;">int oldCapacity =<span style="color: #000000;"> elementData.length;
<span style="color: #008000;">//<span style="color: #008000;"> 设置新容量是原容量的1.5倍
<span style="color: #0000ff;">int newCapacity = oldCapacity + (oldCapacity >> 1<span style="color: #000000;">);
<span style="color: #008000;">//<span style="color: #008000;"> 可能会有一次加入多个数据的情况 那么久直接加到所需容量
<span style="color: #0000ff;">if (capacity - newCapacity > 0<span style="color: #000000;">)
newCapacity =<span style="color: #000000;"> capacity;
elementData =<span style="color: #000000;"> Arrays.copyOf(elementData,newCapacity);
}
<span style="color: #0000ff;">public E get(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
rangeCheck(index);
<span style="color: #0000ff;">return<span style="color: #000000;"> (E)elementData[index];
}
<span style="color: #0000ff;">private <span style="color: #0000ff;">void rangeCheck(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
<span style="color: #0000ff;">if (index < 0 || index >=<span style="color: #000000;"> size)
<span style="color: #0000ff;">throw <span style="color: #0000ff;">new IllegalArgumentException("下标越界:" +<span style="color: #000000;"> index);
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> indexOf(Object o) {
<span style="color: #0000ff;">if (o == <span style="color: #0000ff;">null<span style="color: #000000;">) {
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < size; ++<span style="color: #000000;">i) {
<span style="color: #0000ff;">if (elementData[i] == <span style="color: #0000ff;">null<span style="color: #000000;">)
<span style="color: #0000ff;">return<span style="color: #000000;"> i;
}
} <span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">for (<span style="color: #0000ff;">int i = 0; i < size; ++<span style="color: #000000;">i) {
<span style="color: #0000ff;">if<span style="color: #000000;"> (o.equals(elementData[i]))
<span style="color: #0000ff;">return<span style="color: #000000;"> i;
}
}
<span style="color: #0000ff;">return -1<span style="color: #000000;">;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> contains(Object o) {
<span style="color: #0000ff;">return indexOf(o) >= 0<span style="color: #000000;">;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> size() {
<span style="color: #0000ff;">return<span style="color: #000000;"> size;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> isEmpty() {
<span style="color: #0000ff;">return size == 0<span style="color: #000000;">;
}
<span style="color: #0000ff;">public E remove(<span style="color: #0000ff;">int<span style="color: #000000;"> index) {
rangeCheck(index);
E value =<span style="color: #000000;"> (E)elementData[index];
<span style="color: #0000ff;">int moveSize = size - index - 1<span style="color: #000000;">;
<span style="color: #0000ff;">if (moveSize > 0<span style="color: #000000;">)
System.arraycopy(elementData,index + 1<span style="color: #000000;">,moveSize);
elementData[--size] = <span style="color: #0000ff;">null<span style="color: #000000;">;
<span style="color: #0000ff;">return<span style="color: #000000;"> value;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> remove(Object o) {
<span style="color: #0000ff;">int index =<span style="color: #000000;"> indexOf(o);
<span style="color: #0000ff;">if (index < 0<span style="color: #000000;">) {
<span style="color: #0000ff;">return <span style="color: #0000ff;">false<span style="color: #000000;">;
} <span style="color: #0000ff;">else<span style="color: #000000;"> {
remove(index);
<span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
}
}
<span style="color: #0000ff;">public Iterator<span style="color: #000000;"> iterator() {
<span style="color: #0000ff;">return <span style="color: #0000ff;">new<span style="color: #000000;"> Itr();
}
<span style="color: #0000ff;">private <span style="color: #0000ff;">class Itr <span style="color: #0000ff;">implements Iterator<span style="color: #000000;"> {
</span><span style="color: #0000ff;">int</span> cursor = 0; <span style="color: #008000;">//</span><span style="color: #008000;"> 下一个将返回的元素</span>
<span style="color: #000000;">
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">boolean<span style="color: #000000;"> hasNext() {
<span style="color: #0000ff;">return cursor !=<span style="color: #000000;"> size;
}
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> E next() {
</span><span style="color: #0000ff;">if</span> (cursor < 0 || cursor >=<span style="color: #000000;"> size)
</span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> NoSuchElementException();
Object[] elementData </span>= ArrayListDemo.<span style="color: #0000ff;">this</span><span style="color: #000000;">.elementData;
</span><span style="color: #0000ff;">return</span> (E)elementData[cursor++<span style="color: #000000;">];
}
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
ArrayListDemo list = <span style="color: #0000ff;">new ArrayListDemo<span style="color: #000000;">();
list.add("1"<span style="color: #000000;">);
list.add("2"<span style="color: #000000;">);
list.add("3"<span style="color: #000000;">);
System.out.println(list.get(0<span style="color: #000000;">));
System.out.println(list.get(1<span style="color: #000000;">));
System.out.println(list.get(2<span style="color: #000000;">));
System.out.println(list.indexOf("3"<span style="color: #000000;">));
System.out.println(list.remove("3"<span style="color: #000000;">));
System.out.println(list.contains("3"<span style="color: #000000;">));
<span style="color: #008000;">//<span style="color: #008000;"> System.out.println(list.get(3));
Iterator itr =<span style="color: #000000;"> list.iterator();
<span style="color: #0000ff;">while<span style="color: #000000;"> (itr.hasNext()) {
System.out.println(itr.next());
}
}