1. 程式人生 > 其它 >JAVA api (List,ArrayList,LinkedList的作用和實現)

JAVA api (List,ArrayList,LinkedList的作用和實現)

技術標籤:JAVA API連結串列java資料結構

JAVA api(Collection的概念和用法)
List依然是一個介面它繼承了Collection的功能並且增加了自己的新功能。

List

我們先來大致的說一下List介面的特性:

1.List預設是有順序的(按照輸入元素的順序輸出)
2.List可以有重複元素。
3.List 在1.8版本以後 初始容量是空的 1.6版本以後是給 10 個容量(自動擴容:當容量不夠的時候會自動增加容量)
4.我們也可以給List賦初始容量。

現在我們來看一下新的方法。

方法作用
void add(int index, E element)在索引出插入元素
E get(int index)得到該索引處的值
int indexOf(Object o)返回該值第一次出現的位置
int lastIndexOf(Object o)返回該值最後一次出現的位置
E remove(int index)刪除對應索引的值
E set(int index, E element)將索引處的值替換為指定元素
		List<Integer> l1 = new ArrayList<Integer>(2);
		l1.add(2);
		l1.add(1);
		l1.add(3);
		//在指定地方插入指定元素(前者為索引值,後者為要存的值從0開始,注意長度)
		l1.
add(3,4); System.out.println(l1); //根據索引獲取位置元素 System.out.println(l1.get(1)); //返回第一次出現該元素的索引值 System.out.println(l1.indexOf(1)); //返回最後一次出現該元素的索引值 System.out.println(l1.lastIndexOf(1)); //刪除對應索引值的元素(注意長度)) l1.remove(1); System.out.println(l1); //替換(前者為索引值,後者為要存的值,從0開始,注意長度) l1.set(2,9)
; System.out.println(l1); //擷取(含頭不含尾) List<Integer> l2 = l1.subList(1, 3); System.out.println(l2);

此時我們依舊可以使用迭代,但是使用方式多了一種:

		Iterator<Integer> it = l1.iterator();
		for(Integer i: l1) {
			System.out.print(i+" ");
		}
		System.out.println();		
		ListIterator<Integer> it2 = l1.listIterator();
		//順序遍歷(從前往後)
		while (it2.hasNext()) {
			System.out.print(it2.next()+" ");
		}
		System.out.println();
		//逆向遍歷(從後往前)(此處需要注意如果沒有從前往後從後往前應該是用不了)
		while (it2.hasPrevious()) {
			System.out.print(it2.previous()+" ");
		}

ArrayList

ArrayList底層是用Object陣列實現的,可以認為ArrayList是一個可改變大小的陣列。隨著越來越多的元素被新增到ArrayList中,其規模是動態增加的。而它自動擴容的原理是當長度不夠後,呼叫copyOf()來給陣列擴容,一般擴容大小為現在大小的1.5倍。
它有了陣列的結構,當然也會有陣列的優勢:它的查詢和遍歷的速度是最快的(人家有下標啊),但是它的增加刪除卻不會很快(要麼修改元素的後邊元素全都前移要麼全都後移簡直要命)。
過於底層的東西,就不總結了,我還依稀記得學C++的時候手寫這些東西的痛苦。我喜歡JAVA的地方就在於它封裝的很棒,層次分明條理清晰。

LinkedList

LinkedList底層是個鏈式結構,雙向連結串列,兩端效率高。
1.LinkedList的查詢沒有ArrayList快但是增加和刪除快速很多。
2.在空間上的儲存是不連續的。
我們先來看幾個方法。
第一套

方法名作用
public void addFirst(E e)元素新增至元素首部
public void addFirst(E e)元素新增至元素尾部
public E getFirst()得到首元素
public E getLast()得到尾元素
public E removeFirst()移除首元素
public E removeLast()移除尾元素

第二套

方法名作用
public boolean offerFirst(E e)元素新增至元素首部
public boolean offerLast(E e)元素新增至元素尾部
public E peekFirst()得到首元素
public E peekLast()得到尾元素
public E pollFirst()移除首元素
public E pollLast()移除尾元素
		LinkedList<Integer> l1= new LinkedList<Integer>();
		l1.add(1);
		l1.add(2);
		l1.add(3);
		l1.add(4);
		System.out.println("初始連結串列:"+l1);
		l1.addFirst(5);//首元素
		l1.addLast(6);//尾元素
		System.out.println("首尾新增:"+l1);
		System.out.println(l1.getFirst());//獲取首元素
		System.out.println(l1.getLast());//取尾元素
		System.out.println(l1.removeFirst());//移除首元素
		System.out.println(l1.removeLast());//移除尾元素
		
		l1.offerFirst(1);
		l1.offerLast(2);
		System.out.println(l1);
		System.out.println(l1.peekFirst());
		System.out.println(l1.peekLast());
		System.out.println(l1.pollFirst());
		System.out.println(l1);
		Iterator it = l1.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}

ArrayList和LinkedList的區別

在這裡插入圖片描述