java集合操作查找表


2017年6月27日學習總結

Map接口

Map接口定義的集合又稱查找表,用於存儲"key-value"映射對。key可以看成是value的索引,作爲key的對象在集合中

不可以重複。

根據內部數據結構的不同,Map接口有多種實現類,其中常用的有內部爲hash表實現的HashMap和內部爲排序二叉樹實現的TreeMap。


V put(K key, V value)方法:

將key-value對存入Map,如果在集合中已經包含該key,則操作將替換該key所對應的value,返回值爲該key原來所對應的value(如果沒有則返回null)。


V get(Object key)方法:

返回參數key所對應的value對象,如果不存在則返回null。


boolean containsKey(Object key)方法:

若Map中包含給定的key則返回true,否則返回false。


HashMap

hashCode 的常規協定是

在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。

如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用hashCode 方法都必須生成相同的整數結果。

如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用hashCode 方法 要求一定生成不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同整數結果可以提高哈希表的性能。 

此實現假定哈希函數將元素適當地分佈在各桶之間,可爲基本操作(getput)提供穩定的性能。迭代 collection 視圖所需的時間與HashMap 實例的「容量」(桶的數量)及其大小(鍵-值映射關係數)成比例。所以,如果迭代性能很重要,則不要將初始容量設置得太高(或將加載因子設置得太低)。

HashMap 的實例有兩個參數影響其性能:初始容量加載因子容量 是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。

通常,默認加載因子 (.75) 在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數 HashMap 類的操作中,包括getput 操作,都反映了這一點)。在設置初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減少 rehash 操作次數。如果初始容量大於最大條目數除以加載因子,則不會發生 rehash 操作。

如果很多映射關係要存儲在 HashMap 實例中,則相對於按需執行自動的 rehash 操作以增大表的容量來說,使用足夠大的初始容量創建它將使得映射關係能更有效地存儲。

 

Set<K> keySer()方法:

將當前Map中所有的key存入一個Set集合後返回。


Set<Entry<K,V>> entrySet()方法:

將當前Map中每一組key-value對封裝爲一個Entry對象並存入一個Set集合後返回。


Collection<V> values()方法:

將當前Map中所有的value存入一個Collection集合後返回。


有序的Map

LinkedHashMap實現有序Map

使用Map接口的哈希表和鏈表實現,具體可預知的迭代順序。此實現與HashMap的不同之處在於:

LinkedHashMap維護着一個雙向循環鏈表。此鏈表定義了迭代順序,該迭代順序通常就是存放元素的順序。


案例:

package june;


import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
 * 測試查找表的類
 * @author overfront
 *
 */
public class MapTest {

public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("小牛", 5000);
map.put("中牛", 10000);
map.put("大牛", 20000);

Integer salary = map.get("大牛");
System.out.println("大牛的薪資是:"+salary);

boolean whether = map.containsKey("攻城獅");
System.out.println("有攻城獅嗎:"+whether);

Set<Entry<String,Integer>> setEntry = map.entrySet();
for(Entry<String,Integer> e : setEntry){
String name = e.getKey();
Integer wages =e.getValue();
System.out.println(name+"月工資是"+wages);
}

}

}


控制檯輸出結果:

大牛的薪資是:20000 有攻城獅嗎:false 小牛月工資是5000 中牛月工資是10000 大牛月工資是20000