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是一個排序後的集合,當遍歷其中的元素時是已經排序好的: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);