1. 程式人生 > >Map--HashMap TreeMap

Map--HashMap TreeMap

pri 重復 shm cast 每次 map遍歷 線程不安全 collect cnblogs

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