容器深入研究,調查研究不夠深入
通常的:
映射表(也稱關聯陣列)的基本思想是它維護的鍵-值(對)關聯,因此你可以使用鍵來尋找值。
標準的Java類庫中包含了Map的幾種實現,包括:HashMap,TreeMap,LinkedHashMap,WeakHashMap,ConcurrentHashMap,IdentityHashMap。
它們都有同樣的基本介面Map,但是行為特性各不相同,這表現在效率、鍵值對的儲存及呈現次序、對象的儲存周期、映射表如何在多線程程式中工作的判定“鍵”等價的策略方面。Map介面實現的數量應該讓你感覺到這種工具的重要性。
你可以獲的對Map更深入的理解,這有助於觀察關聯陣列是如何建立的。下面是一個極其簡單的實現。
class AssociativeArray<K,V> {private Object[][] pairs;private int index;public AssociativeArray(int length) {pairs = new Object[length][2];}public void put(K key, V value) {if (index >= pairs.length) {throw new ArrayIndexOutOfBoundsException();}pairs[index++] = new Object[]{key, value};}public V get(K key) {for (int i = 0; i < index; i ++) {if (key.equals(pairs[i][0])) {return (V) pairs[i][1];}}return null;}@Overridepublic String toString() {StringBuffer result = new StringBuffer();for (int i = 0; i < index; i++) {result.append(pairs[i][0].toString());result.append(":");result.append(pairs[i][1].toString());if (i < index - 1) {result.append("\n");}}return result.toString();}}
上面的本版是簡單性的、缺乏效率性的,並且由於具有固定的尺寸顯得夠不靈活。
效能:
效能是映射表中的一個重要問題,當在get()中使用線性搜尋時,執行速度回相當的慢,而這正是HashMap提高速度的地方。
HashMap使用了特殊的值,稱作散列碼,來取代對鍵的緩慢搜尋。散列碼是“相對唯一”的、用以代表對象的int值,它是通過將該對象的某些資訊進行轉換搜尋而成的。
hashCode()是根類Object中的方法,因此所有Java對象都能產生散列碼,HashMap就是使用對象的hashCode()進行快速查詢的,此方法可以顯著的提高效能。
下面是基本的Map實現。在HashMap上打星號表示如果沒有其他的限制,它就應該成為你的預設選擇,因為它對速度進行了最佳化。其他的都強調其他的特性,因此都不如HashMap快。
HashMap:
Map基於散列表的實現(它取代了HashTable)。插入和查詢“鍵值對”的開銷是固定的。可以通過構造器設定容量和負載因子,以調整容器的效能。
LinkedHashMap:
類似於HashMap,但是迭代遍曆時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點;而在迭代訪問時反映更快,因為它使用的鏈表維護內部次序。
TreeMap:
基於紅/黑樹狀結構的實現。查看“鍵”或“鍵值對”時,它們會被排序(次序由Comparable或者Comparator決定)。TreeMap特點在於,所得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
WeakHashMap:
弱鍵(weak key)映射,允許釋放映射所指向的對象;這是為解決某類特殊問題而設計的。如果映射之外沒有引用指向某個“鍵”,則此“鍵”可以被記憶體回收行程回收。
ConcurrentHashMap:
一種安全執行緒的Map,它不涉及同步加鎖。
IdentityHashMap:
使用==代替equals()對“鍵”進行比較的散列映射。專為解決特殊問題設計的。
散列是映射中儲存元素的最常用的方式。
對Map中使用的鍵的要求與對Set中的元素的要求一樣。任何鍵都必須有一個equals()方法;如果鍵被用於散列Map,那麼它必須還具有恰當的hashCode()方法;如果鍵被用於TreeMap它必須實現Comparable。
SortedMap:
用SortedMap(TreeMap時期現階段的唯一實現),可以確保鍵處於排序狀態。這使得它具有額外的功能,這些功能是由SortedMap介面中的下列方法提供給的:
Comparator<? superK> |
comparator() 返回對此映射中的鍵進行排序的比較子;如果此映射使用鍵的自然順序,則返回null。 |
Set<Map.Entry<K,V>> |
entrySet() 返回在此映射中包含的映射關係的 Set 視圖。 |
K |
firstKey() 返回此映射中當前第一個(最低)鍵。 |
SortedMap<K,V> |
headMap(K toKey) 返回此映射的部分視圖,其鍵值嚴格小於 toKey。 |
Set<K> |
keySet() 返回在此映射中所包含鍵的 Set 視圖。 |
K |
lastKey() 返回映射中當前最後一個(最高)鍵。 |
SortedMap<K,V> |
subMap(K fromKey,K toKey) 返回此映射的部分視圖,其鍵值的範圍從 fromKey(包括)到 toKey(不包括)。 |
SortedMap<K,V> |
tailMap(K fromKey) 返回此映射的部分視圖,其鍵大於等於 fromKey。 |
Collection<V> |
values() 返回在此映射中所包含值的 Collection 視圖。 |
LindedHashMap:
為了提高速度,LinkedHashMap散列化所有的元素,但是在遍曆鍵值對時,卻又以元素的插入順序返回鍵值對(System.out.println())。
此外,可以在構造器中設定LinkedHashMap,使之採用基於訪問最近最少使用(LRU)演算法,於是沒有訪問過的(可被看做需要刪除的)元素就會出現在隊列的掐面,對於需要定期清理元素以節省空間的程式來說,此功能是很容易實現的。
誰可以推薦一個學零基礎java較合理的一個步驟,需要買一本什樣的書
我給你的建議是:
1:先學習學習C語言,當然這和你成為一個java有著必然的聯絡,因為只有學習了C語言你才能知道底層的東西,比如B+樹,Map,鏈表,指標,遞迴等一些最基本的東西
2:如果你不想學習C語言那也可以,但是你不會成為特別厲害的高手,你只會局限於初級或者初級中級之間,建議學習一下譚浩強的C語言就可以了
3:學習Java,建議剛開始不要看物件導向思想,核心代碼之類的書籍,最開始找上一本入門的書籍確保上面的東西你都能看懂,並且都能完全理解,並且你可以開始鄙視作者的編碼規範以及很垃圾的代碼,這個時候你可以學習一下《物件導向思想》《java核心技術》
4:學習完上述幾本書之後,你可以看看《重構》《Java編碼藝術》《effictive Java》,這些書籍能讓你對你的物件導向思想帶來不小的進步
5:之後你可以看看《設計模式》,完全理解設計模式所包含的思想,對設計模式運用自如,到這個地步java對你來說就已經不是很難了,你就可以嘗試去看啊JDK核心代碼了
6:看看《Spring in action》學會面向方面編程,然後看看Spring核心原始碼
7:相信到這一步LZ已經是少見的高手了
8:如果你還對J2ee感興趣的話,你可以從Servlet開始,struts,jsf,jsp,webwork,ibatis,hibernate,有了前面的基礎這些技術你在半年之內都可以掌握了
9:最後給樓主一句忠誠的建議:任何東西都離不開基礎,即使某些人感覺自己很了不得,基礎一般,他也就只能定位在一定的水平上,萬丈高樓始於一磚
10:相信你會成功的!因為你已經開始上路了,現在留帖提問就是很好的證明,證明樓主比較有上進心,加油!!!
錯誤提示