Map--HashMap TreeMap
Map:
a) 是一個單獨的接口,不屬於Collection,屬於集合,存放的是鍵值對
b) 鍵不能重復,如果重復,後面添加的會覆蓋前面添加的
c) Map.put(k, v)返回的是上一次添加的相同鍵的值(即被覆蓋的值)
1 Map遍歷:
a) Set<K> keyset()
得到所有鍵的集合存儲到一個Set中,並返回一個Set集合,因為Set有叠代器,所以使用叠代器叠代,每次叠代出一個鍵,再根據鍵獲取值
Set<String> keys = map.keySet(); Iterator<String> ite = keys.iterator();while(ite.hasNext()) { String key = ite.next(); String value = map.get(key); System.out.println(key + "=" + value); }
b) Set<Map.Entry<K, V>> entrySet()
i. Map.Entry<K, V>映射關系類型
ii. Entry是定義在Map中的一個靜態接口,有了集合中的鍵值對,才會存在映射關系,所以映射關系是對集合內部事物的描述,所以定義在Map內部
iii. 得到每個鍵值對對應的映射關系類型的值,存到Set集合匯總,並返回該集合,因為Set有叠代器,每次叠代出來的是一個映射類型的值,從這個映射關系類型的值中,即可以得到鍵,也可以得到值
Set<Map.Entry<String, String>> entry = map.entrySet(); Iterator<Map.Entry<String, String>> ite = keys.iterator(); while(ite.hasNext()) { Map.Entry<String, String> en = ite.next(); String key= en.getKey(); String value = en.getValue(); System.out.println(key + "=" + value); }
2 HashMap:
a) 底層使用的數據結構是hash結構
b) 線程不安全
c) 如何保證鍵不能重復(和HashSet相同)
i. int hashCode()
ii. Boolean equals(Object obj)
public int hashCode() { return name.hashCode()+age*33; } public boolean equals(Object obj) { if(!obj instanceof Student) throw new ClassCastException("類型轉換異常"); Student stu = (Student)obj; return this.name.equals(stu.name) && this.age==stu.age; }
3 TreeMap:
a) 底層使用的數據結構是二叉樹,可以排序
b) 線程不安全
c) 根據什麽排序?(和TreeSetSet相同)
i. 根據鍵排序
ii. 實現Comparable的compareTo()方法
public int compareTo(Student stu) { int num = this.name.compareTo(stu.name); return num==0 ? this.age-stu.age : num; }
i. 自定義一個排序方式
class ComByAge implements Compartor<Student> { int num = s1.getAge() - s2.getAge(); return num==0 ? s1.getName().compareTo(s2.getName()) : num; }
Map--HashMap TreeMap