数组是一组内存地址连续的存储单元,所以用数组实现的线性表是顺序存储的。可以通过数组下标轻易的访问不同位置的数据,但要注意下标越界的异常(ArrayIndexOutOfBoundsException)
用数组实现的线性表,查询与更改方法有着优势。(因为有下标)
1.MyList接口定义功能
public interface MyList { //新增一个元素 void add(Object element); //删除与输入元素相同的元素 void delete(Object element); //根据索引删除元素 void delete(int index); //更新元素 void update(int index,Object newelement); //三种查询形式 boolean contains(Object element); Object at(int index); int indexOf(Object element); }
2.MyArrayList类实现接口功能
1 public class MyArrayList implements MyList{ 2 private Object elements[];//真正存储元素的底层结构 3 private int size;//当前的存储个数 4 private int capcity;//总容量 5 6 public MyArrayList(int capcity) 7 { 8 this.size=0; 9 this.capcity=capcity; 10 elements=new Object[capcity]; 11 } 12 public MyArrayList() 13 { 14 this(10); 15 } 16 @Override 17 public void add(Object element) { 18 if(size==capcity)//因为数组是不可变长的,所以需要进行特殊扩容 19 { 20 capcity=capcity*2; 21 Object newElements[]=new Object[capcity]; 22 for(int i=0;i<size;i++) 23 { 24 newElements[i]=elements[i]; 25 } 26 elements=newElements; 27 } 28 elements[size++]=element; 29 30 } 31 32 @Override 33 public void delete(Object element) { 34 int index=indexOf(element);//调用本类的方法 35 if(index>=0) 36 delete(index); 37 38 39 } 40 41 @Override 42 public void delete(int index) { 43 //防复杂度的震荡 44 if(size<=capcity/4&&!(capcity/4==0)) 45 { 46 capcity=capcity/2; 47 Object newElements[]=new Object[capcity]; 48 for(int i=0;i<size;i++) 49 { 50 newElements[i]=elements[i]; 51 } 52 elements=newElements; 53 } 54 if(size>0)//防止下标溢出 55 { 56 for(int i=index;i<size-1;i++) 57 { 58 elements[i]=elements[i+1]; 59 } 60 elements[size-1]=null; 61 size--; 62 } 63 } 64 65 @Override 66 public void update(int index, Object newelement) { 67 elements[index]=newelement; 68 69 } 70 71 @Override 72 public boolean contains(Object element) { 73 return indexOf(element)>=0; 74 75 76 } 77 78 @Override 79 public Object at(int index) { 80 return elements[index]; 81 } 82 83 84 @Override 85 public int indexOf(Object element) { 86 for(int i=0;i<size;i++) 87 { 88 //注意要用equals方法进行比较,因为类型为Object. 89 if(element.equals(elements[i])) 90 return i; 91 } 92 return -1; 93 } 94 95 @Override 96 public String toString() 97 { 98 //for循环对 字符的改变过多 需要使用可变字符串(减少对内存的消耗) 99 StringBuilder sb=new StringBuilder("["); 100 for(int i=0;i<size;i++) 101 { 102 sb.append(elements[i]+(i<size-1?",":"")); 103 } 104 sb.append("]"); 105 return "MyArrayList{elements="+sb+"}"+" capciyt:"+getCapcity()+" size:"+getSize(); 106 } 107 108 109 public int getSize() { 110 return size; 111 } 112 113 public int getCapcity() { 114 return capcity; 115 } 116 117 118 119 120 121 }