- 构想初衷:众所周知,Java在当前现阶段的各个版本当中,提供的Array数组均有不可变性。无论是直接创建数组还是间接创建数组,数组的长度均不可变。这就导致在使用数组时,无法实现数组的改变等功能。而为实现此类功能,相应的Java提供了ArrayList动态数组以及LinkList链表等功能。然而,ArrayList受制于内容类型必须统一的原因,部分功能又难以实现。因此,泛型数组应运而生。
- 泛型的概念:泛型,即“参数化类型”。一般情况下我们在提及参数的时候,参数的类型均是确定的,例如String A, 或者int B。 然而,正因为在泛型数组中我们目的是多种数据类型均可以实现的功能,我们将这些数据类型参数化,由具体数据/具体操作来实现。
- 代码思路:由于要实现增添删改的功能,创建接口提供增添删改四种抽象功能,并将这四种功能在类之中继承并重写。
代码:
import java.util.Arrays;
public class MyArrayList<E> implements MyArrayListFunction<E> {
//设定长度,以及声明myList为数组
private int Length;
private Object[] myList = new Object[Length];
// 添加元素
public void add(E e) {
// 创建新的数组
Object[] myListNew = new Object[Length + 1];
// 把想要加入的元素保存在新的数组的最后一位,另外注意此时新的数组长度已经改变
myListNew[Length] = e;
// 将原来的数组复制给新的数组
for (int i = 0; i < myList.length; i++) {
myListNew[i] = myList[i];
// 将新数组赋值给原数组
myList = myListNew;
// 数组长度发生改变
Length = Length + 1;
}
}
// 删除元素(类似于添加元素)
public void remove(int inputIndex) {
//先判断输入的索引是正还是负,即判断是正向索引还是负向索
if(inputIndex>0) {
if (inputIndex<myList.length-1) {int index = inputIndex;
// 创建一个新的数组以承装保留下来的元素
Object[] myListNew = new Object[Length - 1];
// 将要删除的元素位置以前的元素复制
for (int i = 0; i < index; i++) {
myListNew[i] = myList[i];
// 将要删除的元素位置以后的元素复制
for (int i = index; i < myList.length; i++) {
myListNew[i - 1] = myList[i];
}
// 将新数组赋值给原数组
myList = myListNew;
// 数组长度减一
Length = Length - 1;
}
else {
System.out.println("输入的索引有误");
}
}
else {
if (Math.abs(inputIndex) <= myList.length) {
int index = myList.length - Math.abs(inputIndex);
// 创建一个新的数组以承装保留下来的元素
Object[] myListNew = new Object[Length - 1];
// 将要删除的元素位置以前的元素复制
for (int i = 0; i < index; i++) {
myListNew[i] = myList[i];
}
// 将要删除的元素位置以后的元素复制
for (int i = index; i < myList.length; i++) {
myListNew[i - 1] = myList[i];
}
// 将新数组赋值给原数组
myList = myListNew;
// 数组长度减一
Length = Length - 1;
}
else {
System.out.println("输入的索引有误");
}
}
}
// 修改元素
public void renew(int index, Object e) {
myList[index] = e;
}
// 查找元素
public E get(int index) {
return (E) myList[index];
}
public static void main (String[] args) {
MyArrayList<Integer> list = new MyArrayList<Integer>();
list.Length = 4;
//设置myList这个属性
list.myList =new Integer[] {1,2,3,5};
//检验是否设置成功
Object x = list.myList[0];
String intArrayString = Arrays.toString(list.myList);
//如果成功输出了X和列表本身的内容,则myList属性设置成功
System.out.println(x);
System.out.println(intArrayString);
//测试add这个方法
list.add(4);
Object y = list.myList[0];
System.out.println(y);
}
}
```
```java
//接口代码
public interface MyArrayListFunction<E> {
public interface MyArraylist<E> {
// 添加元素
public abstract void add(E e);
// 获得元素
public abstract E get(int index);
// 删除元素
public abstract void remove(int index);
// 修改元素
public abstract void renew(int index, E e);
}
}