先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 }
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 }
toString() hashCode() equals() 方法重写