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;
}
*/
}