天天看點

Map,HashMap,Hashtable,TreeMap總結

package map;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;

public class MapDemo {

	public static void main(String[] args) {
		/*
		 * HashMap繼承自Map接口,是基于哈希表的雙列集合,是不同步的,鍵是唯一的,鍵和值可以為空,不保證順序
		 */
		HashMap<String,Integer> hm = new HashMap<String,Integer>();
		/*
		 * put方法會鍵值對添加到HashMap中,并且傳回此鍵的原值,如果沒有原值,傳回null
		 * 添加同一個鍵的對應關系時,新值會将原值覆寫,
		 */
		System.out.println(hm.put("a", 32));
		System.out.println(hm.put("a", 33));
		/*
		 * remove方法會删除指定的鍵的對應關系,并傳回對應的值,如果沒有該對應關系,傳回null
		 */
		System.out.println(hm.remove("z"));
		hm.put("z", 100);
		System.out.println(hm.remove("z"));
		/*
		 * containsKey和containsValue分别用于判斷HashMap中是否存在指定的鍵和值,
		 * 如果存在傳回true,不存在傳回false,反過來可以通過傳回值來判斷是否存在
		 * 鍵和值
		 */
		System.out.println(hm.containsKey("a"));
		System.out.println(hm.containsKey("b"));
		System.out.println(hm.containsValue(33));
		System.out.println(hm.containsValue(24));
		/*
		 * isEmpty用來判斷HashMap是否為空,如果為空傳回true,不為空傳回false
		 */
		System.out.println(hm.isEmpty());
		/*
		 * get方法可以通過指定的鍵擷取其對應的值,如果不存在傳回null
		 */
		System.out.println(hm.get("a"));
		System.out.println(hm.get("x"));
		/*
		 * values方法可以獲得HashMap中所有的值,因為Map不要求值是唯一的,是以傳回Collection
		 * 對Collection進行周遊,可以擷取每一個值
		 */
		hm.put("s", 22);
		hm.put("v", 23);
		hm.put("j", 24);
		Collection<Integer> values = hm.values();
		Iterator it = values.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
		/*
		 * keySet方法傳回HashMap中所有的key,因為key是唯一的,是以以map的形式傳回
		 * 然後使用疊代器周遊,可以擷取到所有的key和value
		 */
		Set<String> keySet = hm.keySet();
		Iterator it1 = keySet.iterator();
		while(it1.hasNext()){
			String key = (String) it1.next();
			Integer value = hm.get(key);
			System.out.println(key+"::"+value);
		}
		/*
		 * entrySet方法傳回HashMap中所有的鍵值對,同樣以Set形式,周遊拿到每個
		 * 鍵值對Map.Entry<String, Integer>,然後通過Map.Entry的getKey和getValue
		 * 方法可以擷取到所有的key和value
		 */
		Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();
		Iterator it2 = entrySet.iterator();
		while(it2.hasNext()){
			Map.Entry<String, Integer> keyToValue = (Map.Entry<String, Integer>)it2.next();
			String key = keyToValue.getKey();
			Integer value = keyToValue.getValue();
			System.out.println(key+"::"+value);
		}
		
		/*
		 * Hashtable繼承自Dictionary類,雙列集合,同步的,鍵是唯一的,
		 * 鍵和值都不可以為null(與HashMap最重要的差別),不保證順序,HashTable
		 * 保證鍵唯一的原理:先判斷哈希值,如果相等,在判斷equals如果為true則不存
		 * 如果哈希值不等,或者equals傳回false則存入該鍵值對。
		 */
		Hashtable ht = new Hashtable();
		/*
		 * 如果以String為鍵,因為String已經重寫了hashCode和equals方法,是以下面存入的
		 * 2會将1覆寫掉。但是自定義的Person類,如果不重寫hashCode和equals方法,那麼兩個
		 * zhangsan都會被存入到HashTable中。
		 */
		ht.put(new Person("zhangsan",20),2);
		ht.put(new Person("zhangsan",20),3);
		ht.put("a", 1);
		ht.put("a", 2);
		System.out.println(ht);
		
		/*
		 * TreeMap是雙列集合,是不同步的,鍵是唯一的,鍵值都不允許為null,是有序的,
		 * 與TreeSet類似,都是通過比較器或者元素自身的比較來決定元素的順序。
		 */
		TreeMap tm = new TreeMap(new ComparatorImpl());
		tm.put(new Person("zhangsan",20), 1);
		tm.put(new Person("zhangsan",22), 2);
		tm.put(new Person("lisi",22), 1);
		tm.put(new Person("zhaowu",24), 1);
		tm.put(new Person("qianliu",26), 1);
		//tm.put(null, 3);
		//tm.put(new Person("wangcai",22), null);
		//tm.put(null, null);
		
		System.out.println(tm.size());
		
		Set<Person> keySet1 = tm.keySet();
		Iterator it3 = keySet1.iterator();
		while(it3.hasNext()){
			Person p = (Person) it3.next();
			Integer value = (Integer) tm.get(p);
			System.out.println(p.getName()+"::"+p.getAge()+"::"+value);
		}
		
		
		
	}

}

class ComparatorImpl implements Comparator{   
	//自定義比較器,實作Comparator借口,重寫compare方法。
	public int compare(Object o1, Object o2) {
		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		int temp = p1.getName().compareTo(p2.getName());
		//按照名字排序,如果名字相同,就以年齡排序
		return (temp==0)?p1.getAge()-p2.getAge():temp;
	}
}
           
package map;

public class Person {
	
	private String name;
	private int age;
	
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	/*
	@Override
	public boolean equals(Object obj) {
		Person p = (Person)obj;
		if(this.getName().equals(p.getName())&&this.getAge()==p.getAge()){
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		
		return this.getName().hashCode()+this.getAge()*3;
	}
	*/
	
	
}