您的位置:首页 > 编程语言 > Java开发

JAVA--自己实现ArrayList

2017-06-22 17:25 309 查看
本次实现的ArrayList并未使用泛型,以后添加。

在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。

附上一个链接深入Java集合学习系列:ArrayList的实现原理

我自己实现了ArrayList中的add,get,set,remove方法

MyArrayList:

import java.util.Arrays;
/*
* ArrayList的底层实现为数组
* MyArrayList暂时不考虑泛型
*/
public class MyArrayList {
private Object[] elementData;//存放Object的数组
private int size;//ArrayList大小

public MyArrayList() {
this(10);//如果不指定大小,默认大小为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);//插入一个元素,至少需要size+1大小的空间
elementData[this.size++] = obj;
}
public void add(int index,Object obj) {//在index处插入元素obj
RangeCheck(index);
checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间
System.arraycopy(elementData, index, elementData, index+1, size-index);//将index后的元素都后移一个位置
elementData[index] = obj;
size++;
}
private void checkCapacity(int needCapacity) {//检查ArrayList开辟的空间是否足够,如果不足则进行扩容
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) {//将index位置置为obj
RangeCheck(index);
Object oldvalue = elementData[index];
elementData[index] = obj;//设置新值
return oldvalue;//返回旧值
}
public Object remove(int index) {//删除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) {//删除等于obj的元素,成功返回true,失败返回false
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])){//obj不为null,一定要在前,否则使用elementData[i]调用equals()可能导致控制在异常
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);
//将index处置为新值
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());
//将index处的元素删除
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java arraylist 源码