Mapjava
集合框架的第二類接口樹。
它提供了一組鍵值的映射。其中存儲的每一個對象都有一個相應的關鍵字(key),關鍵字決定了對象在Map中的存儲位置。
關鍵字應該是惟一的,每一個key 只能映射一個value。面試
實現類:算法
HashMap、TreeMap、LinkedHashMap、Hashtable等
HashMap:鍵值對,key不能重複,可是value能夠重複;key的實現就是HashSet;value對應着放;容許null的鍵或值;(數組加鏈表(哈希表))
Hashtable:線程安全的,不容許null的鍵或值;
Properties::key和value都是String類型,用來讀配置文件;
TreeMap:對key排好序的Map; key 就是TreeSet, value對應每一個key; key要實現Comparable接口或TreeMap有本身的構造器; (紅黑樹)
LinkedHashMap: 此實現與 HashMap 的不一樣之處在於,後者維護着一個運行於全部條目的雙重連接列表。存儲的數據是有序的。(哈希表加鏈表)
HashMap:
Map 主要用於存儲鍵(key)值(value)對,根據鍵獲得值,所以鍵不容許重複,但容許值重複。
HashMap 是一個最經常使用的Map,它根據鍵的HashCode 值存儲數據,根據鍵能夠直接獲取它的值,具備很快的訪問速度。
HashMap最多隻容許一條記錄的鍵爲Null;容許多條記錄的值爲 Null;
HashMap不支持線程的同步,即任一時刻能夠有多個線程同時寫HashMap;可能會致使數據的不一致。若是須要同步,能夠用 Collections的synchronizedMap方法使HashMap具備同步的能力。數組
HashMap實現原理---散列
Hash哈希算法的意義在於提供了一種快速存取數據的方法,它用一種算法創建鍵值與真實值之間的對應關係。散列表又稱爲哈希表。散列表算法的基本思想是:以結點的關鍵字爲自變量,經過必定的函數關係(散列函數)計算出對應的函數值,以這個值做爲該結點存儲在散列表中地址。
當散列表中的元素存放太滿,就必須進行再散列,將產生一個新的散列表,全部元素存放到新的散列表中,原先的散列表將被刪除。在Java語言中,經過負載因子(load factor)來決定什麼時候對散列表進行再散列。例如:若是負載因子0.75,當散列表中已經有75%位置已經放滿,那麼將進行再散列。
負載因子越高(越接近1.0),內存的使用效率越高,元素的尋找時間越長。負載因子越低(越接近0.0),元素的尋找時間越短,內存浪費越多。
什麼時候需重寫equals?
當一個類有本身特有的「邏輯相等」概念(不一樣於對象身份的概念);
Object類僅僅提供了一個對引用的比較,若是兩個引用不是同一個那就返回false,這是沒法知足大多數對象比較的須要的,因此要覆蓋;
使用==操做符檢查實參是否爲指向對象的引用」
使用instanceof操做符檢查實參是否爲正確的類型
把實參轉換到正確的類型;
對於該類中每個「關鍵」域,檢查實參中的域與當前對象中對應的域值是否匹 配。對於既不是float也不是double類型的基本類型的域,可使用==操做符 進行比較;對於對象引用類型的域,能夠遞歸地調用所引用的對象的equals方法,對於float和double類型的域,先轉換成int或long類型的值,而後使用==操做符比較;
當你編寫完成了equals方法以後,應該問本身三個問題:它是不是對稱的、傳 遞的、一致的? 若是答案是否認的,那麼請找到 這些特性未能知足的緣由,再修改equals方法的代碼
equals()和hashCode()同時覆寫
尤爲強調當一個對象被看成鍵值(或索引)來使用的時候要重寫這兩個方法;
覆寫equals後,兩個不一樣實例可能在邏輯上相等,可是根據Object.hashCode方法卻產生不一樣的散列碼,違反「相等的對象必須具備相等的散列碼」。
致使,當你用其中的一個做爲鍵保存到hashMap、hasoTable或hashSet中,再以「相等的」找另 一個做爲鍵值去查找他們的時候,則根本找不到
不一樣類型的hashCode取值
若是該域是布爾型的,計算(f?0:1)
若是是char,short,byte或int,計算(int)f
若是是long類型,計算(int)(f^(f>>>32))
若是是float類型,計算Float.floatToIntBits(f)
若是是double類型,計算Dobule.doubleToLongBits(f)
若是該域是一個對象引用,遞歸調用hashCode
若是該域是一個數組,則把每一個元素當作單獨的域來處理,對每一個重要的元素計算一個散列碼,安全
Map集合比較:
HashMap的存入順序和輸出順序無關。
LinkedHashMap 則保留了鍵值對的存入順序。
TreeMap則是對Map中的元素進行排序。
由於HashMap和LinkedHashMap 存儲數據的速度比直接使用TreeMap 要快,存取效率要高。
當完成了全部的元素的存放後,咱們再對整個的Map中的元素進行排序。這樣能夠提升整個程序的運行的效率,縮短執行時間。
注意:TreeMap中是根據鍵(Key)進行排序的。而若是咱們要使用TreeMap來進行正常的排序的話,Key 中存放的對象必須實現Comparable 接口。服務器
Map經常使用方法:
Object put(Object key,Object value):用來存放一個鍵-值對Map中
Object remove(Object key):根據key(鍵),移除鍵-值對,並將值返回
void putAll(Map mapping) :將另一個Map中的元素存入當前的Map中
void clear() :清空當前Map中的元素
Object get(Object key) :根據key(鍵)取得對應的值
boolean containsKey(Object key) :判斷Map中是否存在某鍵(key)
boolean containsValue(Object value):判斷Map中是否存在某值(value)
public Set keySet() :返回全部的鍵(key),並使用Set容器存放
public Collection values() :返回全部的值(Value),並使用Collection存放
public Set entrySet() :返回一個實現 Map.Entry 接口的元素 Set數據結構
集合遍歷app
一、加強for循環 for(Obj o:c){syso(o)}
二、使用iterator , Iterator it=c.iterator;
while(it.hasNext()){Object o = it.next()}
三、普通循環:for(Iterator it=c.iterator();it.hasNext();){it.next() }框架
代碼實例異步
總結與面試
1.ArrayList: 元素單個,效率高,多用於查詢
2.Vector: 元素單個,線程安全,多用於查詢
3.LinkedList:元素單個,多用於插入和刪除
4.HashMap: 元素成對,元素可爲空
5.HashTable: 元素成對,線程安全,元素不可爲空
HashMap和Hashtable的區別:
HashMap和Hashtable都是java的集合類,均可以用來存放java對象,這是他們的相同點
如下是他們的區別:
1.歷史緣由:
Hashtable是基於陳舊的Dictionary類的,HashMap是java 1.2引進的Map接口的一個現實。
2.同步性:
Hashtable是同步的,這個類中的一些方法保證了Hashtable中的對象是線程安全的,而HashMap則是異步的,所以HashMap中的對象並非線程安全的,由於同步的要求會影響執行的效率,因此若是你不須要線程安全的結合那麼使用HashMap是一個很好的選擇,這樣能夠避免因爲同步帶來的沒必要要的性能開銷,從而提升效率,咱們通常所編寫的程序都是異步的,但若是是服務器端的代碼除外。
3.值:
HashMap可讓你將空值做爲一個表的條目的key或value
Hashtable是不能放入空值(null)的
ArrayList和Vector的區別:
ArrayList與Vector都是java的集合類,都是用來存放java對象,這是他們的相同點,
區別:
1.同步性:
Vector是同步的,這個類的一些方法保證了Vector中的對象的線程安全的,而ArrayList則是異步的,所以ArrayList中的對象並不 是線程安全的,由於同步要求會影響執行的效率,因此你不須要線程安全的集合那麼使用ArrayList是一個很好的選擇,這樣能夠避免因爲同步帶來的沒必要 要的性能開銷。
2.數據增加:
從內部實現的機制來說,ArrayList和Vector都是使用數組(Array)來控制集合中的對象,當你向兩種類型中增長元素的時候,若是元素的數目超過了內部數組目前的長度他們都須要擴展內部數組的長度,Vector缺省狀況下自動增加原來一倍的數組長度,ArrayList是原來的50%,因此最後你得到的這個集合所佔的空間老是比你實際須要的要大,因此若是你要在集合中保存大量的數據,那麼使用Vector有一些優點,由於你能夠經過設置集合的初始大小來避免沒必要要的資源開銷。
總結:
1)若是要求線程安全,使用Vector,Hashtable
2)若是不要求線程安全,使用ArrayList,LinkedList,HashMap
3)若是要求鍵值對,則使用HashMap,Hashtable
4)若是數據量很大,又要求線程安全考慮Vector
arraylist和linkedlist聯繫與區別
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList以爲優於LinkedList,由於LinkedList要移動指針。
3.對於新增和刪除操做add和remove,LinedList比較佔優點,由於ArrayList要移動數據。 這一點要看實際狀況的。若只對單條數據插入或刪除,ArrayList的速度反而優於LinkedList。但如果批量隨機的插入刪除數據,LinkedList的速度大大優於ArrayList. 由於ArrayList每插入一條數據,要移動插入點及以後的全部數據。
HashMap與TreeMap聯繫與區別
一、 HashMap經過hashcode對其內容進行快速查找,而TreeMap中全部的元素都保持着某種固定的順序,若是你須要獲得一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
二、在Map 中插入、刪除和定位元素,HashMap是最好的選擇。但若是您要按天然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求添加的鍵類明肯定義了hashCode()和 equals()的實現。
兩個map中的元素同樣,但順序不同,致使hashCode()不同。
一樣作測試:在HashMap中,一樣的值的map,順序不一樣,equals時,false;而在treeMap中,一樣的值的map,順序不一樣,equals時,true,說明,treeMap在equals()時是整理了順序了的。