ArrayList和LinkedList的區別

ArrayList和LinkedList的區別

引言

ArrayList和LinkedList 都是對List接口的實現,是常用的兩種存儲結構,那麼它們有哪些區別呢。
在這裏插入圖片描述

區別

1、ArrayList是實現了基於Array(動態數組)的數據結構,LinkedList基於Link(鏈表)的數據結構。

前者是數組隊列,相當於動態數組;後者爲雙向鏈表結構,也可當作堆棧、隊列、雙端隊列。

2、當隨機訪問List時(get和set操作),ArrayList比LinkedList的效率更高,因爲LinkedList是線性的數據存儲方式,所以需要移動指針從前往後依次查找。

3、當對數據進行增加和刪除的操作時(add和remove操作),LinkedList比ArrayList的效率更高,因爲ArrayList是數組,所以在其中進行增刪操作時,會對操作點之後所有數據的下標索引造成影響,需要進行數據的移動。

4、從利用效率來看,ArrayList自由性較低,因爲它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創建,然後添加數據,通過調用下標進行使用;
而LinkedList自由性較高,能夠動態的隨數據量的變化而變化(擴容),但是它不便於使用。

5、ArrayList主要控件開銷在於需要在List列表預留一定空間;而LinkList主要控件開銷在於需要存儲結點信息以及結點指針信息。

源碼:

package com.demo.test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 
 * @author liu.hb
 *ArrayList和LinkedList的大致區別如下:
	1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 
	2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。 
	3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。 
 */
public class ListTest {
	static final int T = 500000;
	

	/**
	 * 
	 * @param list 參數
	 * @return 列表添加數據需要的時間
	 */

	static long timeList(List<Object> list) {
		long start = System.currentTimeMillis();
		Object object = new Object();
		for (int i = 0; i < T; i++) {
			list.add(0, object);
		}
		long time = System.currentTimeMillis() - start;
		return time;
	}
	/**
	 * 
	 * @param list 參數
	 * @return 列表查詢數據需要的時間
	 */
	static long readList(List<Object> list) {
		long start = System.currentTimeMillis();
		for (int i = 0, j = list.size(); i < j; i++) {

		}
		long time = System.currentTimeMillis() - start;
		return time;
	}

	/**
	 * 
	 * @param list 參數
	 * @return 列表添加數據
	 */
	static List<Object> addList(List<Object> list) {
		Object object = new Object();
		for (int i = 0; i < T; i++) {
			list.add(0, object);
		}
		return list;
	}

	public static void main(String[] args) {
		List<Object> list1 = new ArrayList<Object>();
		List<Object> list2 = new LinkedList<Object>();
		
		System.out.println("ArrayList添加" + T + "條耗時:" + timeList(list1));
		System.out.println("LinkedList添加" + T + "條耗時:" + timeList(list2));
		
		System.out.println("ArrayList長度:"+list1.size()+"  LinkedList長度:"+list2.size());
		System.out.println("ArrayList查找" + T + "條耗時:" + readList(list1));
		System.out.println("LinkedList查找" + T + "條耗時:" + readList(list2));
	}

}

運行結果

在這裏插入圖片描述
我們可以看出ArrayList讀取數據效率更高,LinkedList添加或刪除數據效率更高。

發佈了50 篇原創文章 · 獲贊 24 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章