根据数组的原理,自己实现一个简易版的ArrayList
2017-11-04 01:43
651 查看
前言
很早之前查看了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()); } }
相关文章推荐
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- 根据链表的原理,自己实现一个简易版的LinkedList
- 自己实现的一个数组排序并去重的功能
- 实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
- RPC框架原理简述:从实现一个简易RPCFramework说起
- 根据Merge Sort原理, 自己实现的归并排序算法+详细注释+代码(C#,C/C++) [分享]
- 自己写的,用c语言实现的一个数组存储的线性表
- 自己实现的一个简易Spring框架(IoC+AOP)
- java中自己实现一个ArrayList
- 对session的原理解释以及自己实现一个session
- 自己实现一个简单的ArrayList
- 编译原理动手实操,用java实现一个简易编译器-语法解析
- 最近根据别人提示的一个想法,东拼西凑,终于实现了android系统中只能看到自己的系统,我称之为唯一系统。 很多企业做设备或是做产品的或是集成商 其中的一部分设备直接用android智能机。担是又不让
- 模块化思想:创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。 要求:自己设计函数的参数,返回值。
- Struts2原理分析,自己实现一个struts2
- 创建一个数组, 实现函数init()初始化数组、 实现reverse()函数完成数组元素的逆置,实现empty()清空数组。要求:自己设计函数的参数,返回值。
- 实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
- 各位大牛帮忙看看问题出来哪?自己实现一个数组模板类,编译无法通过
- 自己实现一个简易web服务器
- 【java集合】自己实现简易的ArrayList