1.认识动态数组和泛式
之前我们所使用的数组最大的问题在于其可操作性弱,当我们定义完一个数组并存入相应元素后,很难对其中的元素做出增减操作,且数组的长度也不可变,当我们要存入超出数组长度的元素时,就需要给数组扩容,这时候便引入了动态数组ArryList。
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
接着我们思考这样一个问题:在ArryList类中我们在写操作数组的方法时都需要先创建一个数组对象,如果该对象类型为某个特定类型,如int,那么该操作数组的方法也只能对int类型的元素进行操作,对其他类型元素进行操作则需另写一个类再写一个方法。而如果创建Object类型的数组对象,虽然可以操作任意类型的数组,但在根据下标取出相应数据时很容易出现不知道取出的数据为何种数据类型的情况,因此我们引入泛型的概念。
E: 泛型数据类型,用于设置 数组元素 的数据类型,只能为引用数据类型。
通过泛型可以将一个引用类型参数化,也相当于把该特定类的数据类型参数化,例如可以将一个Integer类设为泛型,然后在使用时传入具体的数据类型,这样原本只用于Integer类的方法可以用于传入的任意数据类型。
常用的泛型符号:E K V T..
2.使用动态数组和泛型
先定义一个动态数组并设为泛型,并写一个方法判断数组下标是否越界,
此处要注意E只是一个泛型符,不是一种数据类型,数组的创建任要用Object类,不能用E。
public class ArryList<E>{//在引用类型后加一个<E>意为设作泛型
private Object[] arry = new Object[0];//定义一个Object数组,可以存储任意类型数据
private int size;// size为数组中有效元素个数
private int index;//作为数组下标,默认为0
public void check(int index) {
if (index < 0 || index >= size) {
System.out.println("下标越界。");
}
}
}
(1)添加元素
添加元素有两种方式,一种是直接在数组末尾新添一个元素,还有一种是添加一个元素到指 定下标。基本思路都是创建一个更大容量的新数组,将原数组的数据复制到新数组中,同时添加新元素。
// 添加数据到末位
public E add(E e) {//将返回值设为E,e为要添加的元素名
Object[] newarry = new Object[arry.length + 1];// 创建新的更大容量的数组
for (int i = 0; i < arry.length; i++) { 把原数组的数据复制到新数组中
newarry[i] = arry[i];
}
newarry[arry.length] = e;// 保存要添加的数据数据到新数组中
arry = newarry;// 用新数组替换原数组
size++;// size表示当前数组有效数据个数,arry.length表示数组总长度
return null;
}
//添加数据到指定位置
public E addcertain(E e,int index ) {//e为要添加的元素,index为新元素下标
check(index);//先判断要插入的下标是否越界
Object[] newarry = new Object[arry.length+1];//创建更大容量数组
for(int i=0;i<index;i++) {//index前的元素原封不动地复制到新数组中
newarry[i] = arry[i];
}
newarry[index] = e;//插入元素
for(int i=index;i<arry.length;i++) {//index后的元素都往后移一位
newarry[i+1] = arry[i];
}
arry = newarry;
size++;//有效元素个数加1
return null;
}
(2)移除元素
移除元素也有两种方式,一种是移除某指定下标对应的元素,通过输入下标移除元素,另一种是移除指定的元素,直接输入要移除的元素。
// 移除某下标对应的元素
public E remove(int index) {
check(index);
E e = (E) arry[index];// 将被移除的元素强制转型为E并保存,用于返回
for (int i = index; i < size - 1; i++) {//index后的元素都往前移一位
arry[i] = arry[i + 1];
}
size--;
return e;//返回移除的元素
}
//移除指定数据,返回对应下标
public int removecertain(E e) {
if(e == arry[index]) {
remove(index);
}
return index;//返回下标
}
(3)取出元素
// 取出某下标对应的元素
public E get(int index) {
check(index);
E e = (E)arry[index];//此处要把数组元素强转成E
return e;
}
43)返回元素个数
// 返回数组长有效元素个数
public int returnsize() {
return size;
}
public static void main(String[] args) {
ArryList<Integer> arr = new ArryList<>();//在<>中添加引用数据类型,相当于传入数据类型
arr.add(1);//添加元素“1”
arr.removecertain(1);//移除元素“1”,返回下标0
for(int i=0;i<arr.returnsize();i++) {
System.out.print(arr.get(i) + " ");//输出所有元素
}
}