初版:
public interface ArrayList<E> {
public int size(); // 元素的数量
public boolean isEmpty(); // 是否为空
public boolean contains(int element); // 是否包含某个元素
public void add(int element); // 添加元素到最后面
public int get(int index); // 返回index位置对应的元素
public int set(int index, int element); // 设置index位置的元素
public void add(int index, int element); // 往index位置添加元素
public int remove(int index); // 删除index位置对应的元素
public int indexOf(int element); // 查看元素的位置
public void clear(); // 清除所有元素
}
package com.test;
@SuppressWarnings("unchecked")
public class MyArrayList<E> implements ArrayList<E> {
/**
* 元素的数量
*/
private int size;
/**
* 元素的原始数组,存放变动元素的数组
*/
private int[] elements;
/**
* 默认容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 元素错误值
*/
private static final int ELEMENT_NOT_FOUND = -1;
/**
* 构造函数,创建一个固定大小 数组
*
* @param capaticy 容量
*/
public MyArrayList(int capaticy) {
// 固定数组
// elements = new int[capaticy];
// 修改为动态数组,即如果容量小于默认值,那么直接使用默认10大小的容量
// 否则使用大于10默认值的容量
// 以此来创建灵活多变的数组
capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy;
elements = new int[capaticy];
}
/**
* 默认一个10位大小的整数型数组
*/
public MyArrayList() {
// elements = new int[10];
// elements = new int[DEFAULT_CAPACITY];
// 调用构造函数
this(DEFAULT_CAPACITY);
}
/**
* 元素的数量
*/
@Override
public int size() {
return size;
}
/**
* 是否为空
*/
@Override
public boolean isEmpty() {
return size == 0;
}
/**
* 是否包含某个元素
*/
@Override
public boolean contains(int element) {
// 查找元素索引存在吗,不存在则false,存在为true
return indexOf(element) != ELEMENT_NOT_FOUND;
}
/**
* 添加元素到最后面
*/
@Override
public void add(int element) {
// elements[size++] = element;
// size++;
add(this.size, element);
}
/**
* 返回index位置对应的元素
*
* @param index 索引
*/
@Override
public int get(int index) {
// 如果索引小于0或者索引大于元素的数量
// if (index < 0 || index >= size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheck(index);
// 返回对应索引位置的元素数组
return elements[index];
}
/**
* 设置index位置的元素
*
* @param index 修改索引
* @param element 修改元素值
*/
@Override
public int set(int index, int element) {
// 如果索引小于0或者索引大于元素的数量
// if (index < 0 || index >= size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheck(index);
// 拿到元素组对应的值
int old = elements[index];
// 将要修改元素值赋值给原元素值
elements[index] = element;
// 返回结果-被修改后的元素值
return old;
}
/**
* 往index位置添加元素
*/
@Override
public void add(int index, int element) {
// if (index < 0 || index > size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheckForAdd(index);
ensureCapacity(size + 1);
for (int i = size - 1; i >= index; i--) {
elements[i + 1] = elements[i];
}
elements[index] = element;
size++;
}
/**
* 扩容
*
* @param capacity
*/
private void ensureCapacity(int capacity) {
int oldCapacity = elements.length;
if (oldCapacity >= capacity) {
return;
}
int newCapactiy = oldCapacity + (oldCapacity >> 2);
int[] newElements = new int[newCapactiy];
for (int i = 0; i < elements.length; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
/**
* 删除index位置对应的元素
*/
@Override
public int remove(int index) {
// 如果索引小于0或者索引大于元素的数量
// if (index < 0 || index >= size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheck(index);
//
int old = elements[index];
for (int i = index + 1; i <= size - 1; i++) {
elements[i - 1] = elements[i];
size--;
}
return old;
}
/**
* 查看元素的位置
*/
@Override
public int indexOf(int element) {
// 遍历元素数组里面的所有值
for (int i = 0; i < size; i++) {
// 如果该元素值和查询元素值相等
if (elements[i] == element) {
// 返回该元素索引
return i;
}
}
// 否则,返回 -1
return ELEMENT_NOT_FOUND;
}
/**
* 清除所有元素
*/
@Override
public void clear() {
// 不清空数组,保留数组的内存,方便下次添加使用,避免重新创建数组,减少栈堆消耗
size = 0;
}
@Override
public String toString() {
// 打印格式:[100,50,101]
StringBuilder builder = new StringBuilder();
builder.append("size = ").append(size).append(", body = [");
for (int i = 0; i < size; i++) {
if (i != 0) {
builder.append(", ");
}
builder.append(elements[i]);
}
builder.append("]");
return builder.toString();
}
private void outOfBounds(int index) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
outOfBounds(index);
}
}
private void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
outOfBounds(index);
}
}
}
最终版:
public interface ArrayList2<E> {
public int size(); // 元素的数量
public boolean isEmpty(); // 是否为空
public boolean contains(E element); // 是否包含某个元素
public void add(E element); // 添加元素到最后面
public E get(int index); // 返回index位置对应的元素
public E set(int index, E element); // 设置index位置的元素
public void add(int index, E element); // 往index位置添加元素
public E remove(int index); // 删除index位置对应的元素
public int indexOf(E element); // 查看元素的位置
public void clear(); // 清除所有元素
}
@SuppressWarnings("unchecked")
public class MyArrayList2<E> implements ArrayList2<E> {
/**
* 元素的数量
*/
private int size;
/**
* 元素的原始数组,存放变动元素的数组
*/
private E[] elements;
/**
* 默认容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 元素错误值
*/
private static final int ELEMENT_NOT_FOUND = -1;
/**
* 构造函数,创建一个固定大小 数组
*
* @param capaticy 容量
*/
public MyArrayList2(int capaticy) {
// 固定数组
// elements = new int[capaticy];
// 修改为动态数组,即如果容量小于默认值,那么直接使用默认10大小的容量
// 否则使用大于10默认值的容量
// 以此来创建灵活多变的数组
capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy;
elements = (E[]) new Object[capaticy];
}
/**
* 默认一个10位大小的整数型数组
*/
public MyArrayList2() {
// elements = new int[10];
// elements = new int[DEFAULT_CAPACITY];
// 调用构造函数
this(DEFAULT_CAPACITY);
}
/**
* 元素的数量
*/
@Override
public int size() {
return size;
}
/**
* 是否为空
*/
@Override
public boolean isEmpty() {
return size == 0;
}
/**
* 是否包含某个元素
*/
@Override
public boolean contains(E element) {
// 查找元素索引存在吗,不存在则false,存在为true
return indexOf(element) != ELEMENT_NOT_FOUND;
}
/**
* 添加元素到最后面
*/
@Override
public void add(E element) {
// elements[size++] = element;
// size++;
add(this.size, element);
}
/**
* 返回index位置对应的元素
*
* @param index 索引
*/
@Override
public E get(int index) {
// 如果索引小于0或者索引大于元素的数量
// if (index < 0 || index >= size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheck(index);
// 返回对应索引位置的元素数组
return elements[index];
}
/**
* 设置index位置的元素
*
* @param index 修改索引
* @param element 修改元素值
*/
@Override
public E set(int index, E element) {
// 如果索引小于0或者索引大于元素的数量
// if (index < 0 || index >= size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheck(index);
// 拿到元素组对应的值
E old = elements[index];
// 将要修改元素值赋值给原元素值
elements[index] = element;
// 返回结果-被修改后的元素值
return old;
}
/**
* 往index位置添加元素
*/
@Override
public void add(int index, E element) {
// if (index < 0 || index > size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheckForAdd(index);
ensureCapacity(size + 1);
for (int i = size - 1; i >= index; i--) {
elements[i + 1] = elements[i];
}
elements[index] = element;
size++;
}
/**
* 扩容
*
* @param capacity
*/
private void ensureCapacity(int capacity) {
int oldCapacity = elements.length;
if (oldCapacity >= capacity) {
return;
}
int newCapactiy = oldCapacity + (oldCapacity >> 1);
E[] newElements = (E[]) new Object[newCapactiy];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
}
/**
* 删除index位置对应的元素
*/
@Override
public E remove(int index) {
// 如果索引小于0或者索引大于元素的数量
// if (index < 0 || index >= size) {
// // 抛出下标越界异常,提示信息:索引值,list里存放的元素数量
// throw new IndexOutOfBoundsException("index:" + index + ",size:" + size);
// }
rangeCheck(index);
// 获取该索引下的元素值
E old = elements[index];
// 从索引下一个位置处开始,到数组的数量遍历
for (int i = index + 1; i <= size - 1; i++) {
elements[i - 1] = elements[i];
size--;
}
// 将size-1处的元素置为null,让垃圾回收器进行自动回收
elements[--size] = null;
return old;
}
/**
* 查看元素的位置
*/
@Override
public int indexOf(E element) {
if (element == null) { // 1
for (int i = 0; i < size; i++) {
if (elements[i] == null)
return i;
}
} else {
// 遍历元素数组里面的所有值
for (int i = 0; i < size; i++) {
// 如果该元素值和查询元素值相等
if (elements[i] == element) {
// 返回该元素索引
return i;
}
}
}
// 否则,返回 -1
return ELEMENT_NOT_FOUND;
}
/**
* 清除所有元素
*/
@Override
public void clear() {
for (int i = 0; i < size; i++) {
elements[i] = null;
}
// 不清空数组,保留数组的内存,方便下次添加使用,避免重新创建数组,减少栈堆消耗
size = 0;
}
@Override
public String toString() {
// 打印格式:[100,50,101]
StringBuilder builder = new StringBuilder();
builder.append("size = ").append(size).append(", body = [");
for (int i = 0; i < size; i++) {
if (i != 0) {
builder.append(", ");
}
builder.append(elements[i]);
}
builder.append("]");
return builder.toString();
}
private void outOfBounds(int index) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
private void rangeCheck(int index) {
if (index < 0 || index >= size) {
outOfBounds(index);
}
}
private void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
outOfBounds(index);
}
}
}
测试:
public class Main {
public static void main(String[] args) {
ArrayList<Object> list = new MyArrayList<>();
// 添加元素11
list.add(11);
list.add(100);
list.add(11);
// 将22添加到下标0的元素
// list.add(0,22);
System.out.println(list);
// 删除下标为1的元素
list.remove(1);
System.out.println(list);
}
}
结果:
size = 3, body = [11, 100, 11]
size = 2, body = [11, 11]