從頭認識java-9.4 List的簡介與效能
這一章節我們來討論一下List裡面的兩個常用的容器ArrayList和LinkedList。
1.相同之處
兩個list都是具有順序的序列
2.不同之處
ArrayList善於執行查詢操作,但是插入操作效能不好
LinkedList善於在中間插入元素,但是查詢的效能不好。
3.示範List的一些常用方法
package com.ray.ch09;import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList list = new ArrayList();for (int i = 0; i < 10; i++) {list.add(i);}System.out.println(list.get(3));System.out.println(list.indexOf(5));list.remove(list.indexOf(3));for (Integer param : list) {System.out.println(param);}ArrayList list2 = new ArrayList();list2.add(5);list.retainAll(list2);for (Integer param : list) {System.out.println(param);}list2.clear();list.clear();}}
--------------------------------分割線--------------------------------------
下面是擴充內容
4.測試效能
因為上面教科書說了ArrayList善於查詢,LinkedList善於插入,那麼我們下面來做兩個實驗
(1)插入元素的效能測試
代碼:
package com.ray.ch09;import java.util.ArrayList;import java.util.LinkedList;public class Test {public static void main(String[] args) {long amount = 10000;// 隨時改變這個插入元素的個數long startTime = System.currentTimeMillis();ArrayList arrayList = new ArrayList();for (long i = 0; i < amount; i++) {arrayList.add(Math.ceil(i / 2));}long endTime = System.currentTimeMillis();System.out.println(ArrayList: + (endTime - startTime));System.gc();System.out.println(------------------------------);startTime = System.currentTimeMillis();LinkedList linkedList = new LinkedList();for (long i = 0; i < amount; i++) {linkedList.add(Math.ceil(i / 2));}endTime = System.currentTimeMillis();System.out.println(LinkedList: + (endTime - startTime));}}
我們上面的代碼是在list的中間插入一個元素。
我們通過幾個層級來測試:
amount=10000的輸出:
ArrayList:16
------------------------------
LinkedList:0
amount=100000的輸出:(大部分的時候是下面的結果)
ArrayList:31
------------------------------
LinkedList:15
amount=500000的輸出:(出現逆轉)
ArrayList:125
------------------------------
LinkedList:219
amount=5000000的輸出:(出現逆轉)
ArrayList:1953
------------------------------
LinkedList:2078
amount=9000000的輸出:(linkedlist耗盡記憶體)
ArrayList:3375
------------------------------
java.lang.OutOfMemoryError
綜上所述:LinkedList在資料規模較小的,插入的效能的確比ArrayList要來的好,但是,中間出現了轉折點,當資料達到一定程度,LinkedList插入的效能竟然比ArrayList要低,而且當數量更大時,LinkedList耗盡記憶體拋異常,LinkedList比ArrayList要來到耗記憶體,因為他使用鏈式儲存,儲存的資料比ArrayList要多。
(2)查看元素
代碼:
package com.ray.ch09;import java.util.ArrayList;import java.util.LinkedList;import java.util.Random;public class Test {public static void main(String[] args) {long amount = 1000000;// list的大小int times = 1000;// 查看次數ArrayList arrayList = new ArrayList();for (long i = 0; i < amount; i++) {arrayList.add(Math.ceil(i / 2));}LinkedList linkedList = new LinkedList();for (long i = 0; i < amount; i++) {linkedList.add(Math.ceil(i / 2));}System.out.println(===========查看測試開始===========);Random random = new Random();long startTime = System.currentTimeMillis();for (int i = 0; i < times; i++) {arrayList.get(random.nextInt(times));}long endTime = System.currentTimeMillis();System.out.println(ArrayList: + (endTime - startTime));startTime = System.currentTimeMillis();for (int i = 0; i < times; i++) {linkedList.get(random.nextInt(times));}endTime = System.currentTimeMillis();System.out.println(LinkedList: + (endTime - startTime));}}
我們先在兩個list裡面存放1000000個元素,然後進行隨機查詢。
times=1000時的輸出:
===========查看測試開始===========
ArrayList:0
LinkedList:16
times=10000時的輸出:
===========查看測試開始===========
ArrayList:0
LinkedList:969
times=100000時的輸出:
===========查看測試開始===========
ArrayList:0
LinkedList:等不了的那麼久
事實證明,linkedLIst的查詢效能非常差,ArrayList的非常好。
總結:這一章節我們主要講述了LinkedList和ArrayList,以及對兩者進行一次簡單的效能測試。