ArrayList类是个很有用的存储对象的类,可以存储不限定个数的对象。
其中,用add方法可以将Object的任一实例加入线性表中(例如String是Object的一个子类,所以字符可以加入到线性表中),因此一个线性表中可以有不同类型的数据。
这里简单提一下Object类:Object类是所有Java类的祖先,每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。该类最常用的方法就是toString()和equals(),但toString()由于输出没意义,一般被子类方法覆盖。
public class Text {
public static void main(String[] args) {
java.util.ArrayList cityList=new java.util.ArrayList();
cityList.add(1);
cityList.add(2);
cityList.add(3);
cityList.add(4);
cityList.add(5);
System.out.println("Listsize:"+cityList.size());
System.out.println("Is 9 contains ? "+cityList.contains(9));
System.out.println("The location of 3 : "+cityList.indexOf(3));
System.out.println("Is the list empty ? "+cityList.isEmpty());
cityList.remove(2);
System.out.println(cityList.toString());
for(int i=0;i<cityList.size();i++)
System.out.print(cityList.get(i)+" ");
System.out.println();
java.util.ArrayList circleList=new java.util.ArrayList();
circleList.add(new Circle(2.0));
circleList.add(new Circle(3.0));
System.out.println(((Circle)circleList.get(0)).getRadius());
//attention!!!circleList.get(0)是Object类的,要显式转换为Circle类才可调用getRadius
}
}
class Circle {
private double radius;
Circle(){
this(1.0);
}
Circle(double radius){
this.radius=radius;
}
Circle(double radius,String color,boolean filled){
this.radius=radius;
}
public double getRadius() {
return radius;
}
}
实现结果:
实现完该类的运用后,我用数组写了一个能实现大部分功能的ArrayList类。
class ArrayList{
private Object[] element;
private int size;
public static final int SIZE_OF_ARRAY=10;
ArrayList(){
element=new Object[SIZE_OF_ARRAY];
}
public void add(Object o) {
if(size>=element.length) {//需要扩容
Object[] temp=new Object[element.length*2];
for(int i=0;i<element.length;i++)
temp[i]=element[i];
element=temp;
}
element[size++]=o;
}
public void add(Object o,int index) {
if(index>=size) {
System.out.println("IndexOutofBounds!");
return;
}
if(size>=element.length) {//需要扩容
Object[] temp=new Object[element.length*2];
for(int i=0;i<element.length;i++)
temp[i]=element[i];
element=temp;
}
for(int i=size-1;i>=index;i--)
element[i+1]=element[i];
element[index]=o;
size++;
}
public void clear() {
element=new Object[element.length];
size=0;
}
public void remove(int index) {
if(isEmpty()) {
System.out.println("ArrayisEmpty!");
return;
}
else if(index>=size) {
System.out.println("IndexOutofBounds!");
return;
}
else {
for(int i=index;i<size-1;i++)
element[i]=element[i+1];
size--;
}
}
public void remove(Object o) {
if(isEmpty()) {
System.out.println("ArrayisEmpty!");
return;
}
for(int i=0;i<element.length;i++)
if(element[i]==o) {
for(int j=i;j<size-1;j++)
element[j]=element[j+1];
size--;
}
}
public boolean contains(Object o) {
boolean flag=false;
for(int i=0;i<size;i++)
if(element[i]==o) {
flag=true;
break;
}
return flag;
}
public Object get(int index) {
return element[index];
}
public void set(int index,Object o) {
if(index>=size) {
System.out.println("IndexOutofBounds!");
return;
}
element[index]=o;
}
public int size() {
return size;
}
public boolean isEmpty() {
if(size==0)
return true;
else
return false;
}
public int indexOf(Object o) {
int index=-1;//不存在就返回-1
for(int i=0;i<size;i++)
if(element[i]==o) {
index=i;
break;
}
return index;
}
public int lastIndexOf(Object o) {
int index=-1;//不存在就返回-1
for(int i=0;i<size;i++)
if(element[i]==o)
index=i;
return index;
}
public String toString() {
String s="[";
for(int i=0;i<size-1;i++)
s+=element[i]+", ";
s+=element[size-1]+"]";
return s;
}
}
写完后先与之前的结果进行横向对比,得到一样的结果:
于是修改测试代码如下:
ArrayList testList=new ArrayList();
testList.add(1);
testList.add(2);
testList.add(3);
testList.add(4);
testList.add(5);
testList.add("six");
testList.add("seven");
testList.add("eight");
testList.add("nine");
testList.add("ten");
testList.add(false);
testList.add('c');
System.out.println("Listsize:"+testList.size());
System.out.println("Is 9 contains ? "+testList.contains(9));
System.out.println("The location of 3 : "+testList.indexOf(3));
System.out.println("Is the list empty ? "+testList.isEmpty());
testList.remove(2);
System.out.println(testList.toString());
for(int i=0;i<testList.size();i++)
System.out.print(testList.get(i)+" ");
System.out.println();
ArrayList testcircleList=new ArrayList();
testcircleList.add(new Circle(2.0));
testcircleList.add(new Circle(3.0));
System.out.println(((Circle)(testcircleList.get(0))).getRadius());
System.out.println(testList.contains(false));
System.out.println(testList.indexOf("nine"));
testList.clear();
System.out.println(testList.size());
得到结果:
完全正确!完成了ArrayList类的实现。