1. 程式人生 > >Java中key可以重複的Map集合:IdentityHashMap

Java中key可以重複的Map集合:IdentityHashMap

範例:Map中的key不允許重複,重複就是覆蓋

  1. package org.lxh.demo13.mapdemo;    
  2. import java.util.HashMap;    
  3. import java.util.Iterator;    
  4. import java.util.Map;    
  5. import java.util.Set;    
  6. class Person {                                
  7. // 定義Person類  
  8.     private String name;                     
  9. // 定義name屬性  
  10.     private
    int age;                          
  11. // 定義age屬性  
  12.     public Person(String name, int age) {     
  13. // 通過構造方法為屬性賦值  
  14.         this.name = name;                     
  15. // 為name屬性賦值  
  16.         this.age = age;                       
  17. // 為age屬性賦值  
  18.     }    
  19.     publicboolean equals(Object obj) {      
  20. // 覆寫equals()方法  
  21.         if
     (this == obj) {                    
  22. // 判斷地址是否相等  
  23.             returntrue;                      
  24. // 返回true表示同一物件  
  25.         }    
  26.         if (!(obj instanceof Person)) {       
  27. // 傳遞進來的不是本類的物件  
  28.             returnfalse;                     
  29. // 返回false表示不是同一物件  
  30.         }    
  31.         Person p = (Person) obj;              
  32. // 進行向下轉型  
  33.         if (this.name.equals(p.name) &&  
  34. this.age == p.age) {    
  35.             returntrue ;                     
  36. // 屬性依次比較,相等返回true  
  37.         }else{    
  38.             returnfalse ;                    
  39. // 屬性內容不相等,返回false  
  40.         }    
  41.     }    
  42.     publicint hashCode(){                      
  43. // 覆寫hashCode()方法  
  44.         returnthis.name.hashCode() * this.age ;    
  45. // 計算公式  
  46.     }    
  47.     public String toString() {                      
  48. // 覆寫toString()方法  
  49.         return"姓名:" + this.name + ";年齡:"
  50. this.age;   // 返回資訊  
  51.     }    
  52. }     
  53. publicclass IdentityHashMapDemo01 {    
  54.     publicstaticvoid main(String[] args) {    
  55.         Map<Person, String> map = null;              
  56. // 宣告Map物件,指定  
  57. 泛型型別    
  58.         map = new HashMap<Person, String>();           
  59. // 例項化Map物件  
  60.         map.put(new Person("張三"30), "zhangsan_1");    
  61. // 增加內容  
  62.         map.put(new Person("張三"30), "zhangsan_2");     
  63. // 增加內容,key重複  
  64.         map.put(new Person("李四"31), "lisi");       
  65. // 增加內容  
  66.         Set<Map.Entry<Person, String>> allSet = null;    
  67. // 宣告一個Set集合  
  68.         allSet = map.entrySet();                    
  69. // 將Map介面例項變為  
  70. Set介面例項    
  71.         Iterator<Map.Entry<Person, String>>   
  72. iter = null;    // 宣告Iterator  
  73. 物件    
  74.         iter = allSet.iterator();                
  75. // 例項化Iterator  
  76. 物件    
  77.         while (iter.hasNext()) {                 
  78. // 迭代輸出  
  79.             Map.Entry<Person, String> me =   
  80. iter.next();// 每個物件都是Map.   
  81. Entry例項    
  82.             System.out.println(me.getKey()     
  83.                     + " --> " + me.getValue());    
  84. // 輸出key和value  
  85.         }    
  86.     }    
  87. }   
 

程式執行結果:

  1. 姓名:李四;年齡:31 --> lisi    
  2. 姓名:張三;年齡:30 --> zhangsan_2   
 

從程式的執行結果中可以發現,第二個內容覆蓋了第一個內容,所以此時可以使用Identity HashMap。使用此類時只要地址不相等(key1!=key2),就表示不是重複的key,可以新增到集合中。

範例:使用IdentityHashMap修改程式

  1. package org.lxh.demo13.mapdemo;    
  2. import java.util.IdentityHashMap;    
  3. import java.util.Iterator;    
  4. import java.util.Map;    
  5. import java.util.Set;    
  6. class Person {    
  7.     // 此類與之前定義一樣,此處不再列出  
  8. }    
  9. publicclass IdentityHashMapDemo02 {    
  10.     publicstaticvoid main(String[] args) {    
  11.         Map<Person, String> map = null;          
  12. // 宣告Map物件,指定  
  13. 泛型型別    
  14.         map = new IdentityHashMap<Person, String>();   
  15. // 例項化Map物件  
  16.         map.put(new Person("張三"30), "zhangsan_1");   
  17. // 增加內容  
  18.         map.put(new Person("張三"30), "zhangsan_2");    
  19. // 增加內容,key重複  
  20.         map.put(new Person("李四"31), "lisi");      
  21. // 增加內容  
  22.         Set<Map.Entry<Person, String>> allSet =   
  23. null;   // 宣告一個Set集合  
  24.         allSet = map.entrySet();                 
  25. // 將Map介面例項變為  
  26. Set介面例項    
  27.         Iterator<Map.Entry<Person, String>>   
  28. iter = null;// 宣告Iterator物件  
  29.         iter = allSet.iterator();              
  30. // 例項化Iterator  
  31. 物件    
  32.         while (iter.hasNext()) {                 
  33. // 迭代輸出  
  34.             Map.Entry<Person, String> me =   
  35. iter.next();// 每個物件都是Map.  
  36. Entry例項    
  37.             System.out.println(me.getKey()     
  38.                     + " --> " + me.getValue());    
  39. // 輸出key和value  
  40.         }    
  41.     }    
  42. }   
 

程式執行結果:

  1. 姓名:張三;年齡:30 --> zhangsan_2    
  2. 姓名:張三;年齡:30 --> zhangsan_1    
  3. 姓名:李四;年齡:31 --> lisi   
 

從程式的執行結果中可以發現,現在的key允許重複,只要兩個物件的地址不相等即可。