教你手写一个ArrayList集合

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);
        }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值