数组线性表ArrayList的内部实现
生活随笔
收集整理的這篇文章主要介紹了
数组线性表ArrayList的内部实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線性表是按順序存儲數據是常用的一種數據結構。大多數線性表的典型操作是:
1,初始化線性表
2,判斷表是否為空
3,求線性表的長度
4,讀取線性表中的第i個元素
5,查找滿足條件的數據元素
6,在線性表的第i個位置之前插入一個新的數據元素
7,刪除線性表中的第i個數據元素
8,表置空
9,查找第i個元素的前驅或后繼
10,按一個或多個數據項遞增或遞減重新排列數據元素
數組線性表是順序存儲結構,是最簡單,最常用的數據結構。是在內存中開辟一片連續的存儲空間,用一組連續的存儲單元一次存放數據元素。順序存儲的特點是邏輯上相鄰的數據元素,它們物理位置也是相連的。
優點是:簡單,直觀,隨機存取元素十分容易實現,根據定位公式很容易找到表中每個元素的存儲位置,所以指定第i個結點很方便
缺點是:插入和刪除結點困難,算法效率不高。因為結點是順序存放的,所以插入或刪除一個結點時,必須將該結點以后的所有元素依次向后移動,或者依次向前移動。
JDK1.5以后ArrayList開始引入泛型
接口MyList<E>有操作線性表的基本方法,MyAbstractList<E>抽象類實現了MyList<E>接口,但是該抽象類只是實現了接口中的部分方法,MyArrayList<E>繼承擴展抽象類MyAbstractList<E>抽象類
接口MyList<E>
public interface MyList<E> {//添加一個元素public void add(E e);//在index處添加一個元素public void add(int index,E e);//清楚一個list列表public void clear();//刪除一個元素public boolean remove(E e);//刪除并返回index處的元素public E remove(int index);//index處的元素設置為元素epublic Object set(int index,E e);//判斷是否包含元素epublic boolean contains(E e);//返回index處的元素public E get(int index);//返回列表中第一個與元素e匹配的下標indexpublic int indexOf(E e);//返回列表中最后一個與元素e匹配的元素下標indexpublic int lastIndeOf(E e);//判斷列表是否為空public boolean isEmpty();//返回列表的大小public int size(); } MyAbstractList<E>抽象類
public abstract class MyAbstractList<E> implements MyList<E> {//部分實現MyList接口protected int size=0; protected MyAbstractList(){}protected MyAbstractList(E[] objects){for(int i=1;i<objects.length;i++)add(objects[i]);}@Overridepublic void add(E e){add(size,e);}@Overridepublic void add(int index,E e){}@Overridepublic boolean isEmpty(){return size==0;}@Overridepublic int size(){return size;}@Overridepublic boolean remove(E e){if(indexOf(e)>=0){remove(indexOf(e));return true;}else return false;}@Overridepublic E remove(int index){return null;}@Overridepublic void clear() {// TODO Auto-generated method stub}@Overridepublic Object set(int index, E e) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean contains(E e) {// TODO Auto-generated method stubreturn false;}@Overridepublic E get(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic int indexOf(E e) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int lastIndeOf(E e) {// TODO Auto-generated method stubreturn 0;} } MyArrayList<E>
public class MyArrayList<E> extends MyAbstractList<E> {public static final int INITIAL_CAPACITY=16;private E[] data=(E[])new Object[INITIAL_CAPACITY];public MyArrayList(){}public MyArrayList(E[] objects){for(int i=0;i<objects.length;i++)add(objects[i]);}public void add(int index,E e){ensureCapacity();for(int i=size-1;i>=index;i--)data[i+1]=data[i];data[index]=e;size++; }private void ensureCapacity() {if(size>=data.length){E[] newData=(E[])(new Object[size*2+1]);System.arraycopy(data, 0, newData, 0, size);data=newData;}}public void clear(){data=(E[])new Object[INITIAL_CAPACITY];size=0;}public boolean contains(E e){for(int i=0;i<size;i++){if(e.equals(data[i])) return true; }return false;}public E get(int index){return data[index];}public int indexOf(E e){for(int i=0;i<size;i++)if(e.equals(data[i])) return i;return -1;}public int lastIndexOf(E e){for(int i=size-1;i>=0;i--)if(e.equals(data[i])) return i;return -1;}public E remove(int index){E e=data[index];for(int j=index;j<size-1;j++)data[j]=data[j+1];data[size-1]=null;size--;return e;}public E set(int index,E e){E old=data[index];data[index]=e;return old;}public String toString(){StringBuilder result=new StringBuilder("[");for(int i=0;i<size;i++){result.append(data[i]);if(i<size-1) result.append(",");}return result.toString()+"]";}public void trimToSize(){if(size!=data.length){E[] newData=(E[])new Object[size];System.arraycopy(data, 0, newData, 0, size);data=newData;}} }
總結
以上是生活随笔為你收集整理的数组线性表ArrayList的内部实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaBean网页电子时钟
- 下一篇: MVC程序设计思想