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++; } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络