1. 程式人生 > >ArrayList與LinkedList、TreeSet與HashSet、HashMap與LinkedHashMap之間的比較

ArrayList與LinkedList、TreeSet與HashSet、HashMap與LinkedHashMap之間的比較

前言:人類思考,上帝就發笑

之前ArrayList與LinkedList、TreeSet與HashSet、HashMap與LinkedHashMap之間都比較茫然,下面我針對這

幾個類具體類來進行比較,首先我們上一張圖


在上面的比較中,我們針對相同顏色的倆者分別來進行比較

1.ArrayList與LinkedList比較

ArrayList 採用的是陣列形式來儲存物件的,這種方式將物件放在連續的位置中,所以最大的缺點就是插入刪除時非常麻煩
LinkedList 採用的將物件存放在獨立的空間中,而且在每個空間中還儲存下一個連結的索引  但是缺點就是查詢非常麻煩 要叢第一個索引開始
你可以把 ArrayList看做是一個大小長度可變的陣列來使用~~~ 一般情況也常用這個做查詢操作; 
LinkedList呢 他其實是一種連結串列形式的容器,插入刪除很方便 
以下是他們大體的圖形: 

ArrayList: 
【】【】【】【】【】【】【】【】 
他就是一個數組的形狀; 
LinkedList: 
【】 
_【】 
__【】 
___【】 
他就是一個連結串列形狀:從這個圖中你也應該可以看出為什麼他刪除,新增插入比較方便了吧
2.TreeSet和HashSet的比較
1. HashSet是通過HashMap實現的,TreeSet是通過TreeMap實現的,只不過Set用的只是Map的key
2. Map的key和Set都有一個共同的特性就是集合的唯一性.TreeMap更是多了一個排序的功能.
3. hashCode和equal()是HashMap用的, 因為無需排序所以只需要關注定位和唯一性即可.
   a. hashCode是用來計算hash值的,hash值是用來確定
hash表
索引的. b. hash表中的一個索引處存放的是一張連結串列, 所以還要通過equal方法迴圈比較鏈上的每一個物件 才可以真正定位到鍵值對應的Entry. c. put時,如果hash表中沒定位到,就在連結串列前加一個Entry,如果定位到了,則更換Entry中的value,並返回舊value 4. 由於TreeMap需要排序,所以需要一個Comparator為鍵值進行大小比較.當然也是用Comparator定位的. a. Comparator可以在建立TreeMap時指定 b. 如果建立時沒有確定,那麼就會使用key.compareTo()方法,這就要求key必須實現Comparable介面. c. TreeMap是使用Tree資料結構實現的,所以使用compare介面就可以完成定位了.
我們下面來看個例子(HashSet使用):
import java.util.HashSet;
import java.util.Iterator;
public class WpsklHashSet
{
//java 中Set的使用(不允許有重複的物件):
public static void main(String[] args)
{
  HashSet hashSet=new HashSet();
  String a=new String("A");
  String b=new String("B");
  String c=new String("B");
  hashSet.add(a);
  hashSet.add(b);
  System.out.println(hashSet.size());
  String cz=hashSet.add(c)?"此物件不存在":"已經存在";
  System.out.println("測試是否可以新增物件    "+cz);
  System.out.println(hashSet.isEmpty());
  //測試其中是否已經包含某個物件
  System.out.println(hashSet.contains("A"));
  Iterator ir=hashSet.iterator();
  while(ir.hasNext())
  {
   System.out.println(ir.next());
  }
  //測試某個物件是否可以刪除
  System.out.println(hashSet.remove("a"));
  System.out.println(hashSet.remove("A"));
  //經過測試,如果你想再次使用ir變數,必須重新更新以下
  ir=hashSet.iterator();
  while(ir.hasNext())
  {
   System.out.println(ir.next());
  }

}
}
/**
 * 通過這個程式,還可以測試樹集的新增元素的無序性與輸出的有序性
 */
 
import java.util.TreeSet;
import java.util.Iterator;

public class TreeSetTest
{
    public static void main(String[] args)
    {
        TreeSet tree = new TreeSet();
        tree.add("China");
        tree.add("America");
        tree.add("Japan");
        tree.add("Chinese");
        
        Iterator iter = tree.iterator();
        while(iter.hasNext())
        {
            System.out.println(iter.next());
        }
    }
}

我們可以總結如下:
HashSet無序
TreeSet有序
二者裡邊不能有重複的物件
3.HashMap與LinkedHashMap比較
HashMap底層是hashCode演算法結構。
    LinkedHashMap底層是連結串列結構。
    如果要不確定位置增、刪的話LinkedHashMap比較快。
    如果確定位置增加、查詢的話那麼HashMap比較快。
    LinkedHashMap可以實現快速的查詢第一個元素(First)跟結尾(Last)