Java集合類總結 (三)

HashSet類php

關於HashMap的實現細節
HashMap是用LinkedList實現的,每一個list被稱爲一個桶(bucket),在hashmap中要查找一個元素,首先對傳入的key進行散列,並根據散列函數(最簡單的散列函數是取餘運算)找到是哪一個桶,而後在順着桶的linkedlist尋找這個key。
向HashMap插入一個元素時也同樣,先算散列函數,應該存在到哪一個桶上,若是這個桶上沒有存任何元素,就叫沒有散列衝突(hash collision),那直接存進去便可。若是發生了衝突,即已經有元素存在此桶對應的linkedlist上了,那麼就將此插入元素插入對應list中。 以下圖:
css

固然,若是Hash table太滿的話,就須要從新散列,即準備一個更大的table,將原來老的table中的元素放到新的table中,並將老的table廢棄。html

 

TreeSet類

treeset是一個排序後的集合,當遍歷其中的元素時是已經排序好的:java

SortedSet<String> sorter = new TreeSet<>(); // TreeSet implements
SortedSet
sorter.add("Bob");
sorter.add("Amy");
sorter.add("Carl");
for (String s : sorter) System.println(s);

輸出:
Amy Bob Carl

這種排序是內部使用紅黑樹數據結構實現的。node

將一個元素插入到treeset的時間消耗要比hashmap慢,可是要比插入到arraylist和linkedlist要快(linkedlist若是隻是插入操做會很快,問題是要先尋找到插入的正確位置,故要先從頭遍歷list,消耗時間)。
若是一個tree中包含n個元素,那麼平均要花 log 2 n 次比較找到元素正確插入的位置。
nginx

 

對象比較

上面的TreeSet類須要對象的比較,默認狀況下,假定你要插入的元素實現了接口Comparable:git

public interface Comparable<T>
{
    int comparaTo(T other);
}

還有一種方式是新建立一個類並實現接口Comparator:github

public ItemComparator implements Comparator<Item>
{
    public int compare(Item a, Item b)
    {
        ...
    }
}

而後在TreeSet的構造函數中傳入這個比較器:web

ItemComparator comp = new ItemComparator();
SortedSet<Item> sortByDescription = new TreeSet<>(comp);
相關文章
相關標籤/搜索