为了实现动态数组存入内容多样性,要用到泛型,要实现一个泛型动态数组,我们首先需要定义一个泛型类,使用尖括号<>来表示泛型(限制必须是同类型的数据才能放同一个集合对象(形参)),常用用泛型符号:E K V T... 确定泛型数据类型是必须用引用类型。然后,我们需要定义一个内部的数组来存储元素,由于Java不支持直接创建泛型数组,我们需要使用Object类型的数组,并在合适的地方进行强制类型转换。此外,我们还需要定义两个变量来记录数组的长度和元素的个数,分别为len和size。最后,我们需要提供一个构造方法来初始化数组,并检查参数是否合法。
1.初始数组,构造方法
package ArrayList.arrayListV2;
public class ArrList<E> {
//初始数组
public Object[] arr;
public static int len = 10; //默认数组长度
public int size = 0; //记录有效数据个数
//构造方法初始化数组长度
//自定义长度
public ArrList(int len) {
arr = new Object[len];
}
//默认长度10
public ArrList() {
this(len); //调用构造方法
}
2.添加数据
//添加数据
public void add(E data) {
if (size == arr.length) { //判断是否需要扩容
Object[] newarr = new Object[arr.length * 2];
for (int i = 0; i < arr.length; i++) {
newarr[i] = arr[i];
}
arr = newarr;
}
arr[size] = data;
size++;
}
3.指定位置添加数据
//指定位置添加数据
public void insert(int index, E data) {
if ( index > size-1) { //扩容
Object[] newarr = arr;
arr = new Object[len*2];
for (int i = 0; i <newarr .length; i++) {
arr[i] = newarr[i];
}
for (int i = size-1; i > index; i--) {
arr[i + 1] = arr[i];
}
arr[index] = data;
}else{
for (int i = size-1; i >= index; i--) {
arr[i + 1] = arr[i];
}
arr[index] = data;
size++;
}
}
4.移除指定位置数据 ,返回被删除数据
//移除指定位置数据
public E remove(int index) {
if (index >= 0 && index < len) {
E e= (E) arr[index];
for (int i = index; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
size--;
return e;
} else {
System.out.println("位置不存在");
}
return null;
}
5.移除指定数据
//删除指定数据
public boolean removes(E data) {
for (int i = 0; i < len; i++) {
if (arr[i] == data) {
for (int j = i; j < arr.length - 1; j++) {
arr[j] = arr[j + 1];
}
size--;
return true;
}
}
return false;
}
6.获取指定位置数据,获取长度
//获取指定位置数据
public E get(int index) {
if (index < 0 || index >= arr.length) {
System.out.println("下标越界...");
return null;
}
return (E) arr[index];
}
//获取长度
public int size() {
return size;
}
}
7.测试
package ArrayList.arrayListV2;
public class Array {
public static void main(String[] args) {
ArrList<Integer> list = new ArrList<>();
//测试
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.insert(3,99);
System.out.println("de = "+list.remove(4));
list.removes(99);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
测试中Integer限制为整型,也可用String限制为字符串类型