众所周知,ArrayList是调整数组非常好用的类!那么Java本身是自带ArrayList类的,而且也很实用。但是,今天我们要自己编写一个ArrayList类并测试,来实现对于数组的操作!
1.代码。
import java.util.Arrays; public class ArrayList2023<T> { T[] array; int rear; int DEFAULT_CAPACITY = 10; public ArrayList2023(int capacity) { if (capacity > 0) { this.array = (T[]) new Object[capacity]; } else if (capacity < 0) { System.out.println("数组长度不能小于零,新建了默认长度的数组"); this.array = (T[]) new Object[DEFAULT_CAPACITY]; } else if(capacity == 0) { this.array = null; } else{ throw new IllegalArgumentException("Tllegal Capaity: "+ capacity); } } public ArrayList2023(T[]array,int rear) { this.array = array; this.rear = rear; } public void AddElement(T element){ this.array[rear] = element; rear ++; } public void removeElement(int index){ if(index < 0 || index > rear) { System.out.println("fault"); } for(int i = index;i<rear;i++) { this.array[i] = this.array[i+1]; } rear--; } public void set(int index, T element){ if(index<0 || index > rear) { return; } array[index] = element; } public T get (int index){ if(index<0 || index > rear) { return null; } System.out.println(array[index]); return array[index]; } public int size(){ System.out.println("数组的长度为:" + rear); return rear; } public void isEmpty(){ if(rear == 0){ System.out.println("数组为空"); } else{ System.out.println("数组不为空"); } } @Override public String toString(){ String string = ""; for(int i = 0;i<rear;i++) { string = string + array[i].toString()+"\n"; } return string; } }
这个代码包含了ArrayList类的基本操作,比如Add,Remove,get,set等方法。这些方法的实现属于“弱小”方法,虽有一定的容错率但容错率不是很高。相比于Java自带的”健壮“代码,还有发展的空间,但这个代码的测试效果还是喜人的!
2.测试代码
import java.util.ArrayList; import java.util.Scanner; public class ArrayList2023Test { public static void main(String[] args) { String name,id, quit = "continue"; Scanner scan = new Scanner(System.in); ArrayList2023 arrayList2023 = new ArrayList2023(28); Student student1 = new Student("厉害的" ,"王老师"); arrayList2023.AddElement(student1); System.out.println(arrayList2023); while(! quit.equals("quit")){ System.out.println("请输入学生的姓名学号: "); name = scan.nextLine(); id = scan.nextLine(); student1 = new Student(name,id); arrayList2023.AddElement(student1); System.out.println("继续还是退出?输入quit以退出,任意以继续"); quit = scan.nextLine(); } System.out.println(arrayList2023); System.out.println("请输入要删除同学的序号: "); int index = scan.nextInt(); arrayList2023.removeElement(index); System.out.println("删除后的线性表的内容: "); System.out.println(arrayList2023); System.out.println("请输入要修改的同学的序号: "); index = scan.nextInt(); System.out.println("请输入修改后的内容: "); String element; element = scan.nextLine(); element = scan.nextLine(); arrayList2023.set(index,element); System.out.println(arrayList2023); System.out.println("请输入要查找的同学的序号: "); index = scan.nextInt(); arrayList2023.get(index); int length; length = arrayList2023.size(); arrayList2023.isEmpty(); } }
测试效果:
(此为数组为空时的效果)
(此为数组不为空时的测试效果)
这样,我们自己编写的ArrayList类就完成了!!!!!
遇到的问题:
编写一个类最大的问题是什么!?
是要熬大夜?是要写断手?是要秃头?是要起名字?
都不是!!!!!
编写一个类最大的问题在于思路!
学习Java的过程中很容易有这样的错觉:看着全会,写了不对。
在这次编写ArrayList类的过程中,我深刻意识到了什么才叫”理解“。在编写前,我看Java库中的源代码时,基本意思也是可以理解的,每一步的目的也好效果也好,感觉自己都已经明白了,然后兴冲冲的创建一个空类去编辑......然后就没有然后了
最后还是在课上老师写完示范方法后才写完整个类。
过程中也有着优化部分,比如规避输出中的很多“Null”。
还有就是要记住方法中“return”就是关门了!不能再添加新的指令,若想输出要这样写:
这些问题都是要有记忆的,下次需要注意!
总而言之,这次作业真的让我备受打击,觉得自己的Java学习太low了,,,不过我觉得现在开始做出调整也应该还是来的及的。希望自己以后可以有更多的“创新力”。