你们好,最近小未来发现有诸多的小伙伴们对于重写科技格局,重写这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、 如果重写不强调hashcode方法会怎样?这里有一个简单的例子:
2、 public class Test {
3、 public static void main(String[] args) throws Exception {
4、 Person per1=new Person('zhangsan',12);
5、 Person per2=new Person('zhangsan',12);
6、 System.out.println(per1.equals(per2));
7、}
8、 }
9、 class Person{
10、 private String name;
11、 private int age;
12、 @Override
13、 public boolean equals(Object o) {
14、 if (this==o) return true;
15、 if (o==null || getClass() !=o.getClass()) return false;
16、 Person person=(Person) o;
17、 if (age !=person.age) return false;
18、 return name.equals(person.name);
19、}
20、 public Person() {
21、}
22、 public Person(String name, int age) {
23、 this.name=name;
24、 this.age=age;
25、}
26、 public String getName() {
27、 return name;
28、}
29、 public void setName(String name) {
30、 this.name=name;
31、}
32、 public int getAge() {
33、 return age;
34、}
35、 public void setAge(int age) {
36、 this.age=age;
37、}
38、 @Override
39、 public String toString() {
40、 return 'Person{' +
41、 'name='' + name + '\'' +
42、 ', age=' + age +
43、 '}';
44、}
45、 }
46、 真实;跑步后;好像没什么问题,结果也在意料之中。
47、 别担心,让我们看看下一个代码示例:
48、 public static void main(String[] args) throws Exception {
49、 //Person per1=new Person('zhangsan',12);
50、 //Person per2=new Person('zhangsan',12);
51、 //System.out.println(per1.equals(per2));
52、 MapPerson, String map=new HashMap();
53、 map.put(new Person('zhangsan',12), 'student');
54、 System.out.println ('output result map.get (newcomer ('Zhang San' 12));
55、}
56、 我们定义一个map,使用Person作为键重写在equals之后,map。get(新人('张三'12))我们期望返回一个学生值。
57、 但程序结果返回的值与期望值相差很大,程序结果为null;
58、 为什么会出现这样一个和你想象中大相径庭的结果?这是因为Person类没有覆盖hashCode方法,导致两个相同的实例具有不相等的哈希代码,这违反了哈希代码约定。
59、 Map的put方法将person对象存储在一个hash桶中,但是get在另一个hash桶中查找该对象,结果可想而知。即使两个实例意外地放在同一个哈希桶中,返回值也不会改变。
60、 这和HashMap的一个优化有关,HashMap缓存每一项的哈希代码,如果不匹配,就不会检查它们的等价性,所以还是返回null。
61、 所以重写重写hashCode之后的结果会如预期吗?让我们来试试:
62、 public class Test {
63、 public static void main(String[] args) throws Exception {
64、 //Person per1=new Person('zhangsan',12);
65、 //Person per2=new Person('zhangsan',12);
66、 //System.out.println(per1.equals(per2));
67、 MapPerson, String map=new HashMap();
68、 map.put(new Person('zhangsan',12), 'student');
69、 System.out.println ('output result map.get (newcomer ('Zhang San' 12));
70、}
71、 }
72、 class Person{
73、 private String name;
74、 private int age;
75、 @Override
76、 public boolean equals(Object o) {
77、 if (this==o) return true;
78、 if (o==null || getClass() !=o.getClass()) return false;
79、 Person person=(Person) o;
80、 if (age !=person.age) return false;
81、 return name.equals(person.name);
82、}
83、 @Override
84、 public int hashCode() {
85、 int result=name.hashCode();
86、 result=31 * result + age;
87、 return result;
88、}
89、 public Person() {
90、}
91、 public Person(String name, int age) {
92、 this.name=name;
93、 this.age=age;
94、}
95、 public String getName() {
96、 return name;
97、}
98、 public void setName(String name) {
99、 this.name=name;
100、}
101、 public int getAge() {
102、 return age;
103、}
104、 public void setAge(int age) {
105、 this.age=age;
106、}
107、 @Override
108、 public String toString() {
109、 return 'Person{' +
110、 'name='' + name + '\'' +
111、 ', age=' + age +
112、 '}';
113、}
114、 }
115、 结果是学生,不出所料。
以上就是重写这篇文章的一些介绍,希望对大家有所帮助。