本次实现的ArrayList并未使用泛型,以后添加。
在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。
附上一个链接深入Java集合学习系列:ArrayList的实现原理
我自己实现了ArrayList中的add,get,set,remove方法
MyArrayList:
import java.util.Arrays;
public class MyArrayList {
private Object[] elementData;
private int size;
public MyArrayList() {
this(10);
}
public MyArrayList(int initSize) {
if(initSize<0){
throw new IllegalArgumentException("IllegalArgument:"+initSize);
}
elementData = new Object[initSize];
}
public void add(Object obj) {
checkCapacity(size+1);
elementData[this.size++] = obj;
}
public void add(int index,Object obj) {
RangeCheck(index);
checkCapacity(size+1);
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = obj;
size++;
}
private void checkCapacity(int needCapacity) {
if(needCapacity>elementData.length){
Object oldelementData[] = elementData;
int newSize = this.size*2+1;
elementData = new Object[newSize];
elementData = Arrays.copyOf(oldelementData, newSize);
}
}
private void RangeCheck(int index) {
if(index<0||index>=size){
throw new IndexOutOfBoundsException("IllegalArgument"+index);
}
}
public Object get(int index) {
RangeCheck(index);
return elementData[index];
}
public Object set(int index,Object obj) {
RangeCheck(index);
Object oldvalue = elementData[index];
elementData[index] = obj;
return oldvalue;
}
public Object remove(int index) {
RangeCheck(index);
Object oldValue = elementData[index];
int moveNum = size-index-1;
if(moveNum>0){
System.arraycopy(elementData, index+1, elementData, index, moveNum);
}
elementData[--size] = null;
return oldValue;
}
public boolean remove(Object obj) {
if(obj == null){
for(int i=0;i<size;i++){
if(elementData[i]==null){
fastremove(i);
return true;
}
}
}else {
for(int i=0;i<size;i++){
if(obj.equals(elementData[i])){
fastremove(i);
return true;
}
}
}
return false;
}
public void fastremove(int index) {
int moveNum = size-index-1;
if(moveNum>0){
System.arraycopy(elementData, index+1, elementData, index, moveNum);
}
elementData[--size] = null;
}
public int size(){
return this.size;
}
public int length() {
return elementData.length;
}
}
测试:
public class TestMyArrayList {
public static void main(String[] args) {
MyArrayList List = new MyArrayList(5);
List.add(new A("张三"));
List.add(new A("李四"));
List.add(new A("王五"));
List.add(new A("JACK"));
List.add(new A("张三"));
List.add(new A("李四"));
List.add(new A("王五"));
List.add(new A("JACK"));
List.add(2,new A("TOM"));
System.out.println(List.size());
System.out.println(((A)List.get(8)).name);
A oldA = (A)List.set(3, new A("Lucy"));
System.out.println(oldA.name);
System.out.println(((A)List.get(3)).name);
System.out.println(List.size());
oldA = (A)List.remove(3);
System.out.println(oldA.name);
System.out.println(List.size());
A temp = new A("Lily");
List.add(temp);
System.out.println(List.remove(temp));
}
}
class A{
String name;
public A(String name) {
super();
this.name = name;
}
}