ArrayList底层源码实现练习

复制代码
/**
 * Created by chengbx on 2018/5/17.
 * 自己实现一个ArrayList,帮助我们更好的理解ArrayList的底层结构!
 * 一句话概括ArrayList的底层:数组的扩容与数据的拷贝!
 */
public class CbxArrayList {
    //存储集合中的元素
    private Object[] elementData;
    //容器中存储的元素数量
    private int size;

    public  CbxArrayList(){
        this(10);
    }
    public CbxArrayList(int initialCapacity){
        if(initialCapacity < 0){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        elementData = new Object[initialCapacity];
    }

    public void add(Object obj){
        //数组扩容和数据的拷贝
        if(size+1 > elementData.length){
            Object[] newArray = new Object[size*2+1];
            System.arraycopy(elementData,0,newArray,0,elementData.length);
            elementData = newArray;
        }
        elementData[size++] = obj;
    }
    public int size(){
        return  size;
    }

    public boolean isEmpty(){
        return size == 0;
    }
    public Object get(int index){

       RangeCheck(index);
       return elementData[index];
    }
    //索引校验
    private void RangeCheck(int index){
        if(index >= size){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public void remove(int index){
        int numMoved = size - index - 1;
        if(numMoved > 0){
            System.arraycopy(elementData,index+1,elementData,index,numMoved);
        }
        elementData[--size] = null;

    }
    //遍历数组 取出与其相等(equals)的数据 删除
    public boolean remove(Object o){

        for(int i =0;i < size; i++){
            if(o.equals(elementData[i])){ //注意:底层调用的是 而不是 ==
                int numMoved = size - i - 1;
                if(numMoved > 0){
                    System.arraycopy(elementData,i+1,elementData,i,numMoved);
                }
            }
            return true;
        }
        return false;
    }
    //取出原数组索引数据 将新数据赋值到对应索引位置,返回老数据
    public Object set(int index,Object o){
        Object oldData = elementData[index];
        elementData[index] = o;
        return oldData;
    }
    public void add(int index,Object object){
        RangeCheck(index);
        System.arraycopy(elementData,index,elementData,index+1,size - index);
        elementData[index] = object;
        size++;
    }



}
复制代码

 

posted @   猴子特种兵  阅读(185)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络
点击右上角即可分享
微信分享提示