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了