13_7_5 key可以重复的Map集合:IdentityHashMap

Posted on

13_7_5 key可以重复的Map集合:IdentityHashMap

51CTO首页 | 新闻 | 专题 | 论坛 | 博客 | 技术圈 | 读书 | 技术频道| CIO| 存储| 地图 | English

13.7.5 key可以重复的Map集合:IdentityHashMap

http://book.51cto.com/ 2009-08-03 09:31 李兴华 清华大学出版社 我要评论(0)

  • 摘要:《Java开发实战经典》第13章Java类集,本章将对Java类集进行完整的介绍,针对于一些较为常用的操作也将进行深入的讲解。本节为大家介绍key可以重复的Map集合:IdentityHashMap。
  • 标签:IdentityHashMap Java Java开发实战经典 *

13.7.5 key可以重复的Map集合:IdentityHashMap

之前所讲解的所有Map操作中key的值是不能重复的,例如,HashMap操作时key是不能重复的,如果重复则肯定会覆盖之前的内容,如下代码所示。

范例: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 {
    // 定义Person类
  7. private String name;
    // 定义name属性
  8. private int age;
    // 定义age属性
  9. public Person(String name, int age) {
    // 通过构造方法为属性赋值
  10. this.name = name;
    // 为name属性赋值
  11. this.age = age;
    // 为age属性赋值
  12. }
  13. public boolean equals(Object obj) {
    // 覆写equals()方法
  14. if (this == obj) {
    // 判断地址是否相等
  15. return true;
    // 返回true表示同一对象
  16. }
  17. if (!(obj instanceof Person)) {
    // 传递进来的不是本类的对象
  18. return false;
    // 返回false表示不是同一对象
  19. }
  20. Person p = (Person) obj;
    // 进行向下转型
  21. if (this.name.equals(p.name) && this.age == p.age) {
  22. return true ;
    // 属性依次比较,相等返回true
  23. }else{
  24. return false ;
    // 属性内容不相等,返回false
  25. }
  26. }
  27. public int hashCode(){
    // 覆写hashCode()方法
  28. return this.name.hashCode() /* this.age ;
    // 计算公式
  29. }
  30. public String toString() {
    // 覆写toString()方法
  31. return "姓名:" + this.name + ";年龄:"
  • this.age; // 返回信息
  1. }
  2. }
  3. public class IdentityHashMapDemo01 {
  4. public static void main(String[] args) {
  5. Map map = null;
    // 声明Map对象,指定
  6. 泛型类型
  7. map = new HashMap();
    // 实例化Map对象
  8. map.put(new Person("张三", 30), "zhangsan_1");
    // 增加内容
  9. map.put(new Person("张三", 30), "zhangsan_2");
    // 增加内容,key重复
  10. map.put(new Person("李四", 31), "lisi");
    // 增加内容
  11. Set> allSet = null;
    // 声明一个Set集合
  12. allSet = map.entrySet();
    // 将Map接口实例变为
  13. Set接口实例
  14. Iterator> iter = null; // 声明Iterator
  15. 对象
  16. iter = allSet.iterator();
    // 实例化Iterator
  17. 对象
  18. while (iter.hasNext()) {
    // 迭代输出
  19. Map.Entry me = iter.next();// 每个对象都是Map.
  20. Entry实例
  21. System.out.println(me.getKey()
    • " --> " + me.getValue());
      // 输出key和value
  22. }
  23. }
  24. }

程序运行结果:

  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. public class IdentityHashMapDemo02 {
  10. public static void main(String[] args) {
  11. Map map = null;
    // 声明Map对象,指定
  12. 泛型类型
  13. map = new IdentityHashMap(); // 实例化Map对象
  14. map.put(new Person("张三", 30), "zhangsan_1"); // 增加内容
  15. map.put(new Person("张三", 30), "zhangsan_2");
    // 增加内容,key重复
  16. map.put(new Person("李四", 31), "lisi");
    // 增加内容
  17. Set> allSet = null; // 声明一个Set集合
  18. allSet = map.entrySet();
    // 将Map接口实例变为
  19. Set接口实例
  20. Iterator> iter = null;// 声明Iterator对象
  21. iter = allSet.iterator();
    // 实例化Iterator
  22. 对象
  23. while (iter.hasNext()) {
    // 迭代输出
  24. Map.Entry me = iter.next();// 每个对象都是Map.
  25. Entry实例
  26. System.out.println(me.getKey()
    • " --> " + me.getValue());
      // 输出key和value
  27. }
  28. }
  29. }

程序运行结果:

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

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

【责任编辑:云霞 TEL:(010)68476606】 回书目 上一节 下一节 上一篇: 13.7.4 Map接口的使用注意事项(2) 下一篇: 13.8 SortedMap接口

频道推荐

更多>>

刀片服务器 云计算 ARP攻防 思科培训

全站热点

更多>>

ARP攻击防范与..

2009年下半年..

技术人

更多>>

IT十大死对头:L..

程序员面试技巧..

更多>>

更多>>

最新热帖

更多>>

Copyright©2005-2009 51CTO.COM 版权所有

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途