根据数组的原理,自己实现一个简易版的ArrayList
来源:互联网 发布:c和c 程序员面试秘笈 编辑:程序博客网 时间:2024/05/17 06:38
前言
很早之前查看了String、ArrayList的源码,发现其内部的核心就是对数组的操作,于是决定根据其原理,自己来尝试实现一个简易版的的ArrayList。
MyArrayList主要包括增、删、改、查几个功能。
代码如下
/** * 自己写一个简易版的的ArrayList * * @author ALion * @version 2017/11/3 22:35 */public class MyArrayList<E> { private Object[] elementData; private int size; public MyArrayList() { this(10); } public MyArrayList(int initCapacity) { if (initCapacity < 0) { throw new IllegalArgumentException("initCapacity不应该 < 0"); } elementData = new Object[initCapacity]; } /** * 获取容器当前拥有的object的数目 */ public int size() { return size; } /** * 判断容器内object的数目是否为0 */ public boolean isEmpty() { return size == 0; } /** * 在后面添加一个object */ public boolean add(E element) { checkCapacity(); elementData[size++] = element; return true; } /** * 获取index位置的object */ public E get(int index) { checkIndex(index); return (E) elementData[index]; } /** * 移除index位置的object */ public boolean remove(int index) { checkIndex(index); int moveNum = size - (index + 1); if (moveNum > 0) { System.arraycopy(elementData, index + 1, elementData, index, moveNum); elementData[--size] = null; return true; } return false; } /** * 移除一个object */ public boolean remove(Object obj) { for (int i = 0; i < elementData.length; i++) { if (obj.equals(elementData[i])) { return remove(i); } } return false; } /** * 将index位置的值改为传入的object */ public Object set(int index, E element) { checkIndex(index); E old = (E) elementData[index]; elementData[index] = element; return old; } /** * 在index的位置插入一个object */ public boolean add(int index, E element) { checkIndex(index); checkCapacity(); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; return true; } /** * 检查index范围 */ private void checkIndex(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index不能 < 0 或者 >= size"); } } /** * 检查数组容量 */ private void checkCapacity() { if (size >= elementData.length) { Object[] newData = new Object[size * 2 + 1]; System.arraycopy(elementData, 0, newData, 0, elementData.length); elementData = newData; } }}
测试一下
/** * Main * * @author ALion * @version 2017/11/3 23:04 */public class Main { public static void main(String[] args) { MyArrayList<String> list = new MyArrayList<>(); list.add("zhangsan"); list.add("lisi"); for (int i = 0; i < 10; i++) { list.add("wangwu" + i); } System.out.println(list.size()); System.out.println(list.get(5)); list.set(1, "hello"); list.remove(2); list.add(3, "hehe"); System.out.println(list.isEmpty()); }}
阅读全文
0 0
- 根据数组的原理,自己实现一个简易版的ArrayList
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- 根据链表的原理,自己实现一个简易版的LinkedList
- 【java集合】自己实现简易的ArrayList
- 自己实现一个简单的ArrayList
- 自己实现一个简易的SpringMVC
- 自己实现一个ArrayList,模仿ArrayList类的底层结构
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList 的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- ArrayList的实现原理
- mysql关于账户的命令
- iOS获取麦克风权限
- 作业.用类描述计算机中CPU的速度和硬盘容量
- usaco6.3.2 Cryptcowgraphy
- JDK的安装与配置
- 根据数组的原理,自己实现一个简易版的ArrayList
- 安装CAFFE全过程
- Codeforces Round #444 (Div. 2)A. Div. 64
- ssm + redis
- 论文笔记: (compact) Bilinear Pooling, Confusion
- sql server还原数据库出错 备份集中的数据库与现有数据库“XXX”数据库不同
- 数独游戏 开创独有命名式二维数组筛除法
- Pattern matching around type erasure
- win10下Anaconda+python3+opencv3+TensorFlow(CPU)的安装