前言
很早之前查看了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());
}
}