ArrayList集合源码解析
ArrayList底层是数组结构,每次添加元素的时候就会创建一个新的数组,把原来数组中的元素复制到新的数组中。每次删除元素的时候,就会把数组后面的元素往前挪动,并且把最后一个元素置为null,等待垃圾回收器回收。
按照ArrayList集合的原理,我们自己也可以写一个简化版的ArrayList集合,我取名为MyArrayList
添加元素的原理
删除元素的原理
自定义MyArrayList
//实现了Iterable的类,才能成为迭代器或者高级for的目标
//Iterable的类有一个iterator()方法用于获取迭代器,此类复写了iterator()方法,实现自己的迭代器MyItr
public class MyArrayList implements Iterable{
//集合底层就是一Object类型的数组,可以存储任意类型的源码
private Object[] elementData;
//元素个数
private int size;
//创建MyArrayList集合,没有存储任何元素
public MyArrayList(){
this.elementData=new Object[]{};
}
//添加元素
public void add(Object obj){
int s=size;
if(size==elementData.length){
Object[] copy=new Object[size+1];
System.arraycopy(elementData,0,copy,0,size);
elementData=copy;
}
elementData[s]=obj;
size=s+1;
}
//移除指定索引位置的元素
public Object remove(int index){
//记录被删除的元素
Object oldValue = elementData[index];
//计算从删除index索引位置元素之后,后面的元素往前挪动几位
int numMoved = size - index - 1;
//把index+1索引之后的元素移动到index位置
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//把最后一个元素置空,等待垃圾回收器回收
elementData[--size] = null; // clear to let GC do its work
//返回被删除的元素
return oldValue;
}
//修改指定所以位置的元素
public Object set(int index,Object obj){
Object setElement = elementData[index];
elementData[index]=obj;
return setElement;
}
//获取指定索引位置的元素
public Object get(int index){
return elementData[index];
}
//获取集合的大小
public int size(){
return size;
}
//集合内部的迭代器
class MyItr implements Iterator{
int index=-1;
//判断是否有下一个元素
@Override
public boolean hasNext() {
int nextIndex=index+1;
if(nextIndex!=size&&elementData[nextIndex]!=null){
return true;
}
return false;
}
//获取下一个元素
@Override
public Object next() {
int nextIndex=index+1;
Object nextElement=elementData[nextIndex];
index=nextIndex;
return nextElement;
}
}
@Override
public Iterator iterator() {
return new MyItr();
}
}
MyArrayList测试
再写一个测试类,测试MyArrayList中的各种功能
public class Demo2 {
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
//添加元素
list.add(100);
list.add(3.14);
list.add("hello");
list.add(true);
System.out.println("原始数据:"+list);
//修改元素
Object re = list.set(0, "world");
System.out.println("修改后:"+list+"...被修改元素:"+re);
//删除元素
Object e = list.remove(2);
System.out.println("删除后:"+list+"....被删除元素: "+e);
//普通for获取元素
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-------------");
//迭代器遍历元素
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("--------------");
//高级for遍历元素
for (Object o : list) {
System.out.println(o);
}
}
}