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

来源:互联网 发布:ubuntu 目录分类 编辑:程序博客网 时间:2024/05/16 16:06

范例:Map中的key不允许重复,重复就是覆盖

 

[java] view plaincopy
  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.     public boolean equals(Object obj) {      
  20. // 覆写equals()方法    
  21.         if (this == obj) {                    
  22. // 判断地址是否相等    
  23.             return true;                      
  24. // 返回true表示同一对象    
  25.         }    
  26.         if (!(obj instanceof Person)) {       
  27. // 传递进来的不是本类的对象    
  28.             return false;                     
  29. // 返回false表示不是同一对象    
  30.         }    
  31.         Person p = (Person) obj;              
  32. // 进行向下转型    
  33.         if (this.name.equals(p.name) &&  
  34. this.age == p.age) {    
  35.             return true ;                     
  36. // 属性依次比较,相等返回true    
  37.         }else{    
  38.             return false ;                    
  39. // 属性内容不相等,返回false    
  40.         }    
  41.     }    
  42.     public int hashCode(){                      
  43. // 覆写hashCode()方法    
  44.         return this.name.hashCode() * this.age ;    
  45. // 计算公式    
  46.     }    
  47.     public String toString() {                      
  48. // 覆写toString()方法    
  49.         return "姓名:" + this.name + ";年龄:"   
  50. this.age;   // 返回信息    
  51.     }    
  52. }     
  53. public class IdentityHashMapDemo01 {    
  54.     public static void 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. }   
 

程序运行结果:

[java] view plaincopy
  1. 姓名:李四;年龄:31 --> lisi    
  2. 姓名:张三;年龄:30 --> zhangsan_2   
 

从程序的运行结果中可以发现,第二个内容覆盖了第一个内容,所以此时可以使用Identity HashMap。使用此类时只要地址不相等(key1!=key2),就表示不是重复的key,可以添加到集合中。

范例:使用IdentityHashMap修改程序

[java] view plaincopy
  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. public class IdentityHashMapDemo02 {    
  10.     public static void 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. }   
 

程序运行结果:

[java] view plaincopy
  1. 姓名:张三;年龄:30 --> zhangsan_2    
  2. 姓名:张三;年龄:30 --> zhangsan_1    
  3. 姓名:李四;年龄:31 --> lisi   
 

从程序的运行结果中可以发现,现在的key允许重复,只要两个对象的地址不相等即可。

0 0