日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组线性表ArrayList的内部实现

發布時間:2025/3/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组线性表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的内部实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。