2012年9月20日

ArrayList V.S. LinkedList

如標題看到的這兩種JAVA集合物件的比較可以在google搜尋到一堆
不過找到的內容通常都是說
ArrayList因為是用陣列索引值來紀錄
因此在檢索的時候可以很快取得對應位置
但是在插入刪除的時候為了其後續的資料搬移則會影響效能

而LinkedList因為用的是節點之間的pre post來記錄
因此與ArrayList相反的是檢索耗時
插入刪除只需要將其pre post的指標指到另一個新節點
故其在插入或刪除的效能會來的比ArrayList要好

就在剛才做了一個實驗
分別將ArrayList和LinkedList都先置入50萬筆Integer的資料
接下來用list.add(int index, new Integer())的方式隨機置入1萬筆資料
結果如下圖所示















LinkedList完全就沒有比ArrayList快,反而慢了五倍以上


接下來用list.get(random.nextInt())隨機挑選兩集合中的物件
一樣是反覆1萬次,結果如下















可以看出來ArrayList在取得索引位置確實比插入來的快許多
而LinkedList一樣是..........

原因或許是因為ArrayList搬移複製資料的速度非常之快以至於對效能影響不大
而LinkedList光是要找出某個指定位置的值就不知道要靠pre post尋到何時了
等到他費了好大的功夫終於找到所要的位置時
才正要開心的將其pre post指標置換時
ArrayList早八百年前就結束了工作!!!

以下為測試原始碼

import java.util.*;

public class LinkedListVSArrayList{
 public static void main(String[] args){
  int VALUE_NUMBER = 500000;
  ArrayList<Integer> array = new ArrayList<Integer>();
  LinkedList<Integer> linked = new LinkedList<Integer>();

  for(int i=0; i<VALUE_NUMBER; i++){
   Integer integer = new Integer(i);
   array.add(integer);
   linked.add(integer);
  }

  //ArrayList
  computeTimeWaste(array, VALUE_NUMBER);

  //LinkedList
  computeTimeWaste(linked, VALUE_NUMBER);
 }

 public static void computeTimeWaste(List<Integer> list, int VALUE_NUMBER){
  Random random = new Random();
  int temp = 0;
  long beforeTime = System.currentTimeMillis();

  for(int i=0; i<10000; i++){
   //插入
   list.add(random.nextInt(VALUE_NUMBER), new Integer(5));

   //取得
   //temp = list.get(random.nextInt(VALUE_NUMBER));
  }
  long wasteTime = System.currentTimeMillis() - beforeTime;
  System.out.println(list.getClass().getName() + " random many times: " + wasteTime/1000F);
 }
}

2012年9月6日

是打口號還是真正內化

剛才突然想到才又去google了一下正規化這東東
才發現以前大學的時候怎麼看都看不懂的東西
現在竟然覺得怎麼好像都講一些本來就該這樣的道理
想想碩一上的Data Model那堂課上不斷的在辯論ERD
但是老師從未提到正規化這個名詞
雖然老師一再強調說以他的方式根本不需要正規化
但現在想想其實是在建模的過程中把那些不該出現的問題都屏除了
只是我們不遵照正規化的步驟來一步一步做罷了

那麼正規化這個名詞和那五個步驟看來應該就是前人專家們
因為在關聯資料庫的發展當中看見了一些不太好的問題
所以把那一系列問題已規則的方式流程化出來
讓之後要建模的人有一個流程可以遵照著做
大概也是因為這樣所以大學在教關聯資料庫的教科書上都會有正規化部分
讓他有一個看起來正式的流程使學生比較有系統的學習

但是只是背背甚麼1NF、2NF和他裡面的甚麼重複性、遞移性的blabla...
根本無法真正理解到其中的奧妙之處
除非不斷的以實際操作和真實問題來思考這些東西才能漸漸的將他內化成感覺
等到有了這種感覺的時候根本也就不需要這些步驟了

另外最近在接觸的物件導向設計模式看來也是類似的發展
前人在實戰中遇到的不良問題和解決方法把他創造出了那堆模式
如果學習的人只是看看口號想想書中的範例程式應該很難將他內化成感覺
其實身旁的開源程式碼中就有很多模式的案例
有事沒事就想想SE或某開源框架的實作方式是在實現哪種模式也是很好的學習