HashMap类

HashMap类

HashMap 底层是基于哈希表实现的。

 HashMap的存储原理:

     往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希码中的存储位置。
    情况1:如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
    情况2:如果算出的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,如果equals方法返回的是false,  那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允许存储,只会覆盖。

验证1:

对象Person:

   
   
  1. package com.cn.test;
  2. public class Person {
  3. int id;
  4. String name;
  5. public Person(int id, String name) {
  6. super();
  7. this.id = id;
  8. this.name = name;
  9. }
  10. @Override
  11. public String toString() {
  12. return "[" + this.id + this.name + "]";
  13. }
  14. @Override
  15. public int hashCode() {
  16. System.out.println("hashCode方法调用了。。。。。");
  17. return super.hashCode();
  18. }
  19. @Override
  20. public boolean equals(Object obj) {
  21. System.out.println("equals方法调用了。。。。。");
  22. return super.equals(obj);
  23. }
  24. }

main运行:

    
    
  1. package com.cn.test;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * Author:Liu Zhiyong(QQ:1012421396)
  6. * Version:Version_1
  7. * Date:2017年7月21日09:26:21
  8. * Desc: HashMap的存储原理:
  9. 往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希码中的存储位置。
  10. 情况1:如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
  11. 情况2:如果算出的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,如果equals方法返回的是false, 那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允许存储。
  12. */
  13. public class Demo {
  14. public static void main(String[] args) {
  15. Map<Person, String> map = new HashMap<Person, String>();
  16. Person p1 = new Person(110, "汪峰");
  17. map.put(p1, "001");
  18. System.out.println("-------------------------");
  19. Person p2 = new Person(110, "汪峰");
  20. System.out.println("2个对象是否一样?" + map.containsKey(p2));
  21. System.out.println("-------------------------");
  22. map.put(p2, "004");//如果出现了相同的键,那么后添加的值会取代之前的值。
  23. System.err.println(map.toString());
  24. }
  25. }

运行结果:


 分析:

     用Java的类描述对象的时候,如果要判断该对象是否相同时, 通常都会调用equals方法(注意:当此方法被重写时,通常有必须重写  hashCode  方法,以维护  hashCode  方法的常规协定,该协定声明相等对象必须具有相等的哈希码。) 这里的Person对象并没有重写equals和hashCode方法,其p1,p2的hashCode码不同。  往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希码中的存储位置。验证1符合情况1:如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。所以都只调用了hashCode()一个方法

 验证2:

对象Person:   

   
   
  1. package com.cn.test;
  2. public class Person {
  3. int id;
  4. String name;
  5. public Person(int id, String name) {
  6. super();
  7. this.id = id;
  8. this.name = name;
  9. }
  10. @Override
  11. public String toString() {
  12. return "[" + this.id + this.name + "]";
  13. }
  14. @Override
  15. public int hashCode() {
  16. System.out.println("hashCode方法调用了。。。。。");
  17. return this.id;//若Person的id相同,则返回相同的hashCode(id值)
  18. }
  19. @Override
  20. public boolean equals(Object obj) {
  21. System.out.println("equals方法调用了。。。。。");
  22. Person p = (Person)obj;
  23. return this.id == p.id;//若Person的id相同,则返回true
  24. }
  25. }

main运行:

    
    
  1. package com.cn.test;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. /**
  5. * Author:Liu Zhiyong(QQ:1012421396)
  6. * Version:Version_1
  7. * Date:2017年7月21日09:26:21
  8. * Desc: HashMap的存储原理:
  9. 往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素的哈希码值,然后经过运算就可以算出该元素在哈希码中的存储位置。
  10. 情况1:如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
  11. 情况2:如果算出的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,如果equals方法返回的是false, 那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允许存储。
  12. */
  13. public class Demo {
  14. public static void main(String[] args) {
  15. Map<Person, String> map = new HashMap<Person, String>();
  16. Person p1 = new Person(110, "汪峰");
  17. map.put(p1, "001");
  18. System.out.println("-------------------------");
  19. Person p2 = new Person(110, "汪峰");
  20. System.out.println("2个对象是否一样?" + map.containsKey(p2));
  21. System.out.println("-------------------------");
  22. map.put(p2, "004");//如果出现了相同的键,那么后添加的值会取代之前的值。
  23. System.out.println("-------------------------");
  24. System.err.println(map.toString());
  25. }
  26. }

运行结果:


 分析:

    由于重写了Person对象中的hashCode()方法,返回的值为Person对象的id值。又重写了Person对象中的equals()方法,如果当前Person对象的id值与要比较的Person对象的id值一样,则返回true,否则返回false。所以 往HashMap添加重复对象p2的时候,与之前添加过的p1对象有相同的哈希码(Person对象的id值),然后继续通过equals()来判断,结果返回为true。所以视为同一对象,于是添加到map集合中时,覆盖了相同key(p1)中的value(001)值成了004。也就是验证2符合 情况2:如果算出的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,如果equals方法返回的是false,  那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允许存储,只会覆盖。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值