Map_占位符(嗨没想好怎么起名字)

Map 是很好的集合,为我们带来了在其他语言(比如 Perl)中经常可见的好用的键/值对集合。JDK 以 HashMap 的形式为我们提供了方便的 Map 实现,它在内部使用哈希表实现了对键的对应值的快速查找。但是这里也有一个小问题:支持哈希码的键依赖于可变字段的内容,这样容易产生 bug,需要我们注意。

如果我们有个Person对象,并且重写了HashCode方法,那么当我们把这个对象当作HashMap的键来存储内容时,可能就会遇到问题;

 1 package cn.rocker.map;
 2 
 3 /**
 4  * @author rocker
 5  * @version V1.0
 6  * @Description: 重写了HashCode方法的Person对象
 7  * @date 2018/5/5 10:11
 8  */
 9 public class Person {
10 
11     private String firstName;
12     private String lastName;
13     private int age;
14 
15     public Person() {
16     }
17 
18     public Person(String firstName, String lastName, int age) {
19         this.firstName = firstName;
20         this.lastName = lastName;
21         this.age = age;
22     }
23 
24     @Override
25     public String toString() {
26         return "Person{" +
27                 "firstName='" + firstName + '\'' +
28                 ", lastName='" + lastName + '\'' +
29                 ", age=" + age +
30                 '}';
31     }
32 
33     @Override
34     public int hashCode() {
35         return firstName.hashCode() & lastName.hashCode() & age;
36     }
37 
38     public String getFirstName() {
39         return firstName;
40     }
41 
42     public void setFirstName(String firstName) {
43         this.firstName = firstName;
44     }
45 
46     public String getLastName() {
47         return lastName;
48     }
49 
50     public void setLastName(String lastName) {
51         this.lastName = lastName;
52     }
53 
54     public int getAge() {
55         return age;
56     }
57 
58     public void setAge(int age) {
59         this.age = age;
60     }
61 }

 

用HashMap来操作该Person对象

 1 package cn.rocker.map;
 2 
 3 import java.util.HashMap;
 4 
 5 /**
 6  * @author rocker
 7  * @version V1.0
 8  * @Description:
 9  * @date 2018/5/5 9:55
10  */
11 public class mapDemo1 {
12 
13     /**
14      * @Description:    永远不要将可变对象类型用作 HashMap 中的键!!!
15      * @auther: rocker
16      * @date: 2018/5/5 10:10
17      */
18     public static void main(String[] args) {
19         Person p1 = new Person("rocker","melon",20);
20         Person p2 = new Person("williams","apple",40);
21         System.out.println(p1.hashCode());  //16
22 
23         HashMap<Person, Person> pMap = new HashMap<>();
24         pMap.put(p1,p2);
25         p1.setFirstName("franklin");
26         p1.setLastName("hahahaha");
27         System.out.println(p1.hashCode());   //4
28 
29         System.out.println(pMap.get(p1));  //null
30     }
31 
32 }

 

当我们改变p1对象的firstName和lastName时,p1的hashcode就从16变为了4,我们去hashmap中根据这个4去get时,就获取不到对应的value了

 

转载于:https://www.cnblogs.com/rocker-pg/p/8993948.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值