Map接口

        咱們都知道Collection、Set、List接口都屬於單值的操做,即:每次只能操做一個對象,而今天介紹的Map與它們不一樣的是,每次操做的是一對對象,即二元偶對象,Map中的每一個元素都使用key -- value的形式存儲在集合之中,此接口定義以下: public interface Map<K,V>java

     (一)  先來看看Map接口中都有哪些經常使用的方法:緩存

No.安全

方法或類異步

類型性能

描述spa

1線程

public void clear()code

普通對象

清空Map集合blog

2

public boolean containsKey(Object key)

普通

判斷指定的key是否存在

3

public boolean containsValue(Object value)

普通

判斷指定的value是否存在

4

public Set<Map.Entry<K,V>> entrySet()

普通

Map對象變爲Set集合

5

public boolean equals(Object o)

普通

對象比較

6

public V get(Object key)

普通

根據key取得value

7

public int hashCode()

普通

返回哈希碼

8

public boolean isEmpty()

普通

判斷集合是否爲空

9

public Set<K> keySet()

普通

取得全部的key

10

public V put(K key, V value)

普通

向集合中加入元素

11

public void putAll(Map<? extends K,? extends V> t)

普通

將一個Map集合中的內容加入到另外一個Map

12

public V remove(Object key)

普通

根據key刪除value

13

public int size()

普通

取出集合的長度

14

public Collection<V> values()

普通

取出所有的value

提出幾個問題:

1.爲何取出所有的value是Collection形式,而取出來key是Set?

2.返回哈希碼有什麼做用?

3.取出集合的長度用size而不是length?

(二)介紹經常使用的接口

      1. Map.Entry接口

          Map.Entry是Map中內部定義的一個接口,專門用來保存keyvalue的內容。

          Map.Entry接口定義: public static interface Map.Entry<K,V>

        Map.Entry接口的經常使用方法

No.

方法或類

類型

描述

1

public boolean equals(Object o)

普通

對象比較

2

public K getKey()

普通

取得key

3

public V getValue()

普通

取得value

4

public int hashCode()

普通

返回哈希碼

5

public V setValue(V value)

普通

設置value的值

 注意思考爲何沒有setKey的方法呢?

Map與Map.Entry

2.Map接口的經常使用子類

       Map接口的經常使用子類:

       HashMap:無序存放的,是新的操做類,key不容許重複。

       Hashtable:無序存放的,是舊的操做類,key不容許重複。

       TreeMap:能夠排序的Map集合,按集合中的key排序,key不容許重複。

       WeakHashMap:弱引用的Map集合,當集合中的某些內容再也不使用時,能夠清除掉無用的數據,可使用gc進行回收。

       IdentityHashMap:key能夠重複的Map集合。

   2. 着重介紹新的子類:HashMap 

   HashMap自己是Map的子類,直接使用此類爲Map接口實例化便可。 HashMap類的定義以下: public class HashMap<K,V>extends         AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable

 實例操做一:向集合中增長和取出內容 

import java.util.HashMap;
import java.util.Map;
public class HashMapDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 聲明Map對象,
		map = new HashMap<String, String>();	// key和value是String類
		map.put("first", "cool");			 // 增長內容
		map.put("second", "low");	         // 增長內容
		map.put("third", "none");	         // 增長內容
		String val = map.get("first");	     // 根據key求出value
		System.out.println("取出的內容是:" + val);	// 輸出Map,調用toString()
	}
}

實例操做二:判斷指定的key或value是否存在

import java.util.HashMap;
import java.util.Map;
public class HashMapDemo02 {
	public static void main(String[] args) {
		Map<String, String> map = null;			// 聲明Map對象,
		map = new HashMap<String, String>();	// key和value是String類
		map.put("first", "cool");			// 增長內容
		map.put("second", "low");	// 增長內容
		map.put("third", "none");	// 增長內容
		if (map.containsKey("first")) {		// 查找指定的key是否存在
			System.out.println("搜索的key存在!");
		} else {
			System.out.println("搜索的key不存在!");
		}
		if(map.containsValue("cool")){	// 查找指定的value是否存在
			System.out.println("搜索的value存在!");
		}else{
			System.out.println("搜索的value不存在!");
		}
	}
}

實例操做三:輸出所有的key

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo03 {
	public static void main(String[] args) {
		Map<String, String> map = null;		    // 聲明Map對象,
		map = new HashMap<String, String>();	// key和value是String類  
		map.put("first", "cool");		// 增長內容
		map.put("second", "low");	// 增長內容
		map.put("third", "none");	// 增長內容
		Set<String> keys = map.keySet();			// 獲得所有的key
		Iterator<String> iter = keys.iterator();		// 實例化Iterator
		System.out.print("所有的key:");			// 輸出信息
		while (iter.hasNext()) {				// 迭代輸出所有的key
			String str = iter.next();			// 取出集合的key
			System.out.print(str + "、");		// 輸出內容
		}
	}
}

實例操做四:輸出所有的value

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo04 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 聲明Map對象,
		map = new HashMap<String, String>();	// key和value是String類
		map.put("first", "cool");			// 增長內容
		map.put("second", "low");	// 增長內容
		map.put("third", "none");	// 增長內容
		Collection<String> values = map.values();		// 獲得所有的value
		Iterator<String> iter = values.iterator();		// 實例化Iterator
		System.out.print("所有的value:");			// 輸出信息
		while (iter.hasNext()) {				// 迭代輸出
			String str = iter.next();			// 取出value
			System.out.print(str + "、");		// 輸出內容
		}
	}
}

3.舊的子類:Hashtable

public class HashtableDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 聲明Map對象,
		map = new Hashtable<String, String>();		// key和value是String類
		map.put("first", "cool");		// 增長內容
		map.put("second", "low");	// 增長內容
		map.put("third", "none");	// 增長內容
		Set<String> keys = map.keySet();		// 獲得所有的key
		Iterator<String> iter1 = keys.iterator();	// 實例化Iterator
		System.out.print("所有的key:");		// 輸出信息
		while (iter1.hasNext()) {			// 迭代輸出所有的key
			String str = iter1.next();		// 取出內容
			System.out.print(str + "、");		// 輸出內容
		}
		Collection<String> values = map.values();	// 獲得所有的value
		Iterator<String> iter2 = values.iterator();	// 實例化Iterator
		System.out.print("\n所有的value:");		// 輸出信息
		while (iter2.hasNext()) {			// 迭代輸出所有的value
			String str = iter2.next();		// 取出內容
			System.out.print(str + "、");		// 輸出內容
		}
	}
}

HashMap與Hashtable的區別

No.

比較點

HashMap

Hashtable

1

推出時間

JDK 1.2以後推出的,屬於新的操做類

JDK 1.0時推出,屬於舊的操做類

2

性能

採用異步處理方式,性能更高

採用同步處理方式,性能較低

3

線程安全

屬於非線程安全的操做類

屬於線程安全的操做類

4

設置空值

容許設置null

不能設置null,若是設置則出現NullPointerException異常

4.排序的子類:TreeMap 

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;
		map = new TreeMap<String, String>();		// 實例化Map對象
		map.put("A、first", "cool");			// 增長內容
		map.put("C、second", "low");// 增長內容
		map.put("B、third", "none");		// 增長內容
		Set<String> keys = map.keySet();			// 獲得所有的key
		Iterator<String> iter = keys.iterator();		// 實例化Iterator
		while (iter.hasNext()) {				// 迭代輸出
			String str = iter.next();			// 取出key
			System.out.println(str + " --> " + map.get(str));	// 取出key對應的內容
		}
	}
}

5.弱引用類:WeakHashMap

      以前所講解的Map 子類中的數據都是使用強引用保存的,即:裏面的內容不論是否使用都始終在集合中保留,若是但願集合能夠自動清理暫時不用的數據就可使用WeakHashMap類。 WeakHashMap的定義以下: public class WeakHashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>

import java.util.Map;
import java.util.WeakHashMap;
public class WeakHashMapDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;
		map = new WeakHashMap<String, String>();	// 實例化Map對象
		map.put(new String("A"), new String("first"));
		map.put(new String("B"), new String("second"));
		map.put(new String("C"), new String("third"));	
		System.gc();				// 進行垃圾收集
		map.put(new String("D"), new String("fourth")) ;
		System.out.println("內容:" + map);		// 通常只會剩下一個內容  <D,fourth>
	}
}

提示:對象的引用強度說明

       從JDK1.2版本開始,Java把對象的引用分爲四種級別,從而使程式能更加靈活的控制對象的生命週期。這四種級別由高到低依次爲:強引用、軟引用、弱引用和虛引用。

      下面來簡單瞭解如下這四種引用的區別:

       強引用:當內存不足時,JVM寧肯出現OutOfMemeryError錯誤而使程序中止,也不會回收此對象來釋放空間;

       軟引用:當內存不足時,會回收這些對象的內存,用來實現內存敏感的高速緩存;

       弱引用:不管內存是否緊張,被垃圾回收器發現當即回收;

       虛引用:和沒有任何引用同樣。

6.Map接口輸出:

       對於Map接口來講,其自己是不能直接使用迭代(例如:Iterator、foreach)進行輸出的,由於Map中的每一個位置存放的是一對值(key---->value),而Iterator中每次只能找到一個值。因此,若是此時非要使用迭代進行輸出的話,則必須按照如下的步驟完成(以Iterator輸出方法爲例):

一、將Map的實例經過entrySet()方法變爲Set接口對象;

二、經過Set接口實例爲Iterator實例化;

三、經過Iterator迭代輸出,每一個內容都是Map.Entry的對象;

四、經過Map.Entry進行key---->value的分離。

Map輸出方式一:Iterator輸出Map

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class IteratorDemo04 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 聲明Map對象,指定泛型類型
		map = new HashMap<String, String>();		// 實例化Map對象
		map.put("first", "cool");						// 增長內容
		map.put("second", "low");	// 增長內容
		map.put("third", "none");		// 增長內容
		Set<Map.Entry<String, String>> allSet = null;	// 聲明一個Set集合,指定泛型
		allSet = map.entrySet(); 			// 將Map接口實例變爲Set接口實例
		Iterator<Map.Entry<String, String>> iter = null;	// 聲明Iterator對象
		iter = allSet.iterator();			// 實例化Iterator對象
		while (iter.hasNext()) {
			Map.Entry<String,String> me = iter.next();// 找到Map.Entry實例
			System.out.println(me.getKey() 
					+ " --> " + me.getValue());	// 輸出key和value
		}
	}
}

Map輸出方式二:foreach輸出Map

import java.util.HashMap;
import java.util.Map;
public class ForeachDemo02 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 聲明Map對象,指定泛型類型
		map = new HashMap<String, String>();	// 實例化Map對象
		map.put("first", "cool");		// 增長內容
		map.put("second", "low");	// 增長內容
		map.put("third", "none");		// 增長內容
		for (Map.Entry<String, String> me : map.entrySet()) {// 輸出Set集合
			System.out.println(me.getKey() 
					+ " --> " + me.getValue());// 輸出key和value
		}
	}
}

注意事項二:直接使用非系統類做爲key

       若是要使用非系統類做爲Map的key,則此類必須覆寫Object類中的如下兩個方法: hashCode() equals

相關文章
相關標籤/搜索