hashCode() 和 equals() 方法比较和重写

先hashCode(),如果hashCode()相同,再用equal()验证,如果hashCode()都不同,则肯定不同

  然而hashCode()和equal()一样都是基本类Object里的方法,而和equal()一样,Object里hashCode()里面只是返回当前对象的地址,如果是这样的话,那么我们相同的一个类,new两个对象,由于他们在内存里的地址不同,则他们的hashCode()不同,所以这显然不是我们想要的,所以我们必须重写我们类的hashCode()方法,即一个类,在hashCode()里面返回唯一的一个hash值

 1 package com;
 2 
 3 public class Student {
 4     private String name;
 5     private int age;
 6     
 7     public Student() {
 8         super();
 9         // TODO Auto-generated constructor stub
10     }
11 
12     public String getName() {
13         return name;
14     }
15 
16     public void setName(String name) {
17         this.name = name;
18     }
19 
20     public int getAge() {
21         return age;
22     }
23 
24     public void setAge(int age) {
25         this.age = age;
26     }
27 
28     public Student(String name, int age) {
29         super();
30         this.name = name;
31         this.age = age;
32     }
33 
34     @Override
35     public String toString() {
36         return "Student [name=" + name + ", age=" + age + "]";
37     }
38 
39     @Override
40     public int hashCode() {
41         final int prime = 31;
42         int result = 1;
43         result = prime * result + age;
44         result = prime * result + ((name == null) ? 0 : name.hashCode());
45         return result;
46     }
47 
48     @Override
49     public boolean equals(Object obj) {
50         if (this == obj)
51             return true;
52         if (obj == null)
53             return false;
54         if (getClass() != obj.getClass())
55             return false;
56         Student other = (Student) obj;
57         if (age != other.age)
58             return false;
59         if (name == null) {
60             if (other.name != null)
61                 return false;
62         } else if (!name.equals(other.name))
63             return false;
64         return true;
65     }
66     
67     
68 
69     
70     
71 }
Student
 1 package com;
 2 
 3 public class StudentDemo {
 4     public static void main(String[] args) {
 5         Student s =  new Student("tom",10);
 6         //对象的hash值和String的转换
 7         //toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、标记符@和此对象的无符号十六进制组成
 8         String string = s.toString();//返回该对象的字符串表示
 9         //如果不重写得到的是com.Student@7852e922,重写后得到重写后的字符串
10         System.out.println(string);//com.Student@7852e922
11         
12         int hashCode = s.hashCode();//返回该对象的哈希值
13         //如果不重写hashCode得到的是地址值,重写后得到的是该对象里面值的hash值
14         System.out.println(hashCode);//2018699554
15         String hexString = Integer.toHexString(hashCode);
16         System.out.println(hexString);//7852e922
17         
18         //getClass()返回值  此对象运行时类的Class对象
19         String name =  s.getClass().getName();
20         System.out.println(name);//com.Student
21         //打印方法默认调用toString方法
22         System.out.println(s);//com.Student@7852e922
23         
24         Student s1 = new Student("tom",10);
25         Student s2 = new Student("tom",10);
26         //equals()方法比较  要重写  不重写的话得到是地址值的比较
27         boolean b = s1.equals(s2);
28         System.out.println(b);
29         
30         
31     }
32 }
StudentTest

toString()  hashCode()  equals()  方法重写

posted @ 2018-04-18 13:49  star521  阅读(147)  评论(0编辑  收藏  举报