重写Arraylist,原理解析

package com.abing.list;

import java.util.Arrays;

public class ABArrayList<E> implements ABList<E> {
    // ArrayList底层采用数组存放
    transient Object[] elementData;

    //定义默认容量大小
    private static final int DEFAULT_CAPACITY = 10;

    // 记录实际ArrayList大小
    private int size;
    public ABArrayList(){
        this(DEFAULT_CAPACITY);
    }
    public ABArrayList(int initialCapacity) {
        if (initialCapacity < 0) {
            throw new IllegalArgumentException("初始容量不能小于0");
        }
        elementData = new Object[initialCapacity];
    }


    public void add(E e) {
        //1.判断实际存放的数据容量是否大于elementData容量
        ensureExplicitCapacity(size+1);
        //2 .使用下标进行赋值
        elementData[size++]=e;

    }

    @Override
    public E get(int index) {
        rangeCheck(index);
        return elementData(index);
    }
    E elementData(int index) {
        return (E) elementData[index];
    }
    @Override
    public int getSize() {
        return size;
    }

    @Override
    public E remove(int index) {
        //1.使用下标查询该值是否存在
        E e=get(index);
        //计算删除元素后面的长度
        int numMoved=size-index-1;
        //删除原理  使用arraycopy往前移动数据,将最后一个变为空
        if (numMoved>0)
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
        elementData[--size]=null;
        return e;
    }

    @Override
    public boolean remove(E e) {
        for (int i=0;i<elementData.length;i++){
            E ob=elementData(i);
            if (ob.equals(e)){
                remove(i);
                return true;
            }
        }
        return false;
    }

    @Override
    public void add(int index, E e) {
        //判断实际存放的数量容量是否大于elementdata容量
        ensureExplicitCapacity(size+1);
        System.arraycopy(elementData,index,elementData,index+1,size-index);
        elementData[index]=e;
        size++;
    }

    public void ensureExplicitCapacity(int minCapacity){
        if (size==elementData.length){
            int oldCapacity=elementData.length;
            //新数据容量大小  oldCapacity>>1  相当与  oldCapacity/2
            int newCapacity=oldCapacity+(oldCapacity>>1);
            //如果初始容量为1的时候,那么他扩容的大小为多少呢?
            if (newCapacity-oldCapacity<0){
                newCapacity=minCapacity;//最少保证容量和minCapacity一样
            }
            //将老数组的值赋值到新数组里面去
            elementData=Arrays.copyOf(elementData,newCapacity);
        }
    }
    public void rangeCheck(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException("越界啦!");
    }
}
 
package com.abing.list;

public interface ABList<E> {

    public void add(E e);

    public E get(int index);

    public int getSize();

    public E remove(int index);

    public boolean remove(E e);

    public void add(int index,E e);
}
 

1、对于随机访问get和set,ArrayList 要优于LinkedList,因为LinkedList要移动指针

2、对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据

QQ群:247394475

关注微信公众号实时获取新内容


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值