Java 实现ArrayList
附有详细注释,已实现泛型。
其他文章链接:Java 实现LinkedList https://blog.csdn.net/qq_39004632/article/details/103267487
类设计:
- 主类:MyArray1
- 自定义异常类:MyArrayIndexOutOfBoundException
- 测试类:TestMyArray1
主类:MyArray
/**
* 用数组模拟简易集合
*
* @author BouCher
*
* @param <E>
* 数据类型
*/
public class MyArray1<E> {
private Object[] values;// 数组
private final int LEN = 3;// 默认数组初始长度
private int index = 0;// 默认下标
public MyArray1() {
// 无参构造,创建默认长度的数组
this.values = new Object[LEN];
}
public MyArray1(int len) {
// 带参构造,创建len长度的数组
this.values = new Object[len];
}
/**
* 校验输入下标是否合法
*
* @param index
* 下标
*/
private void checkIndex(int index) {
if (index >= this.index || index < 0) {
throw new MyArrayIndexOutOfBoundException("数组下标范围越界,范围是0——" + (this.index - 1));
}
}
/**
* 数组的添加功能:将一个元素添加到数组中
*
* @param value
* 插入的值
*/
public void add(E value) {
// 合法性校验
if (index >= this.values.length) {
// 扩容
Object[] temp = new Object[this.values.length + 1];
for (int i = 0; i < this.values.length; i++) {
temp[i] = this.values[i];
}
// 重新定向引用
this.values = temp;
}
values[index++] = value;
}
/**
* 返回数组元素值
*
* @return
*/
public int size() {
return this.index;
}
/**
* 数组的查询功能:返回输入下标的元素值
*
* @param index
* 输入的下标
* @return 对应下标的元素值
*/
public E get(int index) {
// 合法性校验
checkIndex(index);
return (E) this.values[index];
}
/**
* 数组的删除功能:删除输入下标的元素值
*
* @param index
* 输入的下标
* @return 对应下标的元素值
*/
public E remove(int index) {
// 合法性校验
checkIndex(index);
// 保存返回值
E out = (E) this.values[index];
// 删除
if (index == this.index - 1) {
// 如果下标是数组最后一个元素
this.values[index] = null;
} else {
// 如果下标是数组元素中间值
for (int i = index; i < this.index - 1; i++) {
this.values[i] = this.values[i + 1];
}
}
this.index--;
return out;
}
/**
* 数组的修改功能:修改输入下标的元素值
*
* @param index
* 输入的下标
* @param new_value
* 被修改元素的新值
* @return 被修改元素的旧值
*/
public E edit(int index, E new_value) {
// 合法性校验
checkIndex(index);
// 保存返回值
E out = null;
// 修改
if (this.values[index] == new_value) {
out = (E) this.values[index];
} else {
out = (E) this.values[index];
this.values[index] = new_value;
}
return out;
}
}
自定义异常类:MyArrayIndexOutOfBoundException
public class MyArrayIndexOutOfBoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
public MyArrayIndexOutOfBoundException() {
super();
}
public MyArrayIndexOutOfBoundException(String message) {
super(message);
}
}
测试类:TestMyArray1
public class TestMyArray1 {
public static void main(String[] args) {
MyArray1 m = new MyArray1();
m.add("LT");
m.add("BXX");
m.add(123456);
m.add(654321);
m.add('A');
m.add('B');
System.out.println("-------------------------------");
System.out.println("数组元素为:");
for (int i = 0; i < m.size(); i++) {
System.out.println(m.get(i));
}
System.out.println("-------------------------------");
System.out.println("数组长度:" + m.size());
System.out.println("-------------------------------");
System.out.println("返回数组下标为3的元素:" + m.get(3));
System.out.println("-------------------------------");
System.out.println("返回数组下标为1的元素:" + m.remove(1));
System.out.println("-------------------------------");
System.out.println("修改数组下标为3的元素值为C:" + m.edit(3, 'C'));
}
}