1 class Stu{ 2 private String name = null; 3 private int age = 0; 4 5 public Stu(String name, int age){ 6 this.name = name; 7 this.age = age; 8 } 9 //覆写Object中的equals方法 10 public boolean equals(Object obj){ 11 if(this == obj){ 12 return true; 13 } 14 if(!(obj instanceof Stu)){ 15 return false; 16 } 17 Stu stu = (Stu)obj; 18 if((stu.age == this.age) && this.name.equals(stu.name)){ 19 return true; 20 } 21 return false; 22 } 23 //覆写Object中的hashCode方法 24 public int hashCode(){ 25 return this.name.hashCode() * this.age; 26 } 27 } 28 public class Main { 29 public static void main(String[] args){ 30 System.out.println(new Stu("Xiaobiqiang", 21)); 31 System.out.println(new Stu("Xiaobiqiang", 21)); 32 } 33 }
运行结果:
cheakObjIsEqual.Stu@f87ecac cheakObjIsEqual.Stu@f87ecac
因而当内容完全相同时,new Stu并不会分配另外空间,猜想hashCode决定了new运算是否会分配新空间
验证猜想:把equals方法注释掉
class Stu{ private String name = null; private int age = 0; public Stu(String name, int age){ this.name = name; this.age = age; } //覆写Object中的equals方法 /* public boolean equals(Object obj){ if(this == obj){ return true; } if(!(obj instanceof Stu)){ return false; } Stu stu = (Stu)obj; if((stu.age == this.age) && this.name.equals(stu.name)){ return true; } return false; } */ //覆写Object中的hashCode方法 public int hashCode(){ return this.name.hashCode() * this.age; } } public class Main { public static void main(String[] args){ System.out.println(new Stu("Xiaobiqiang", 21)); System.out.println(new Stu("Xiaobiqiang", 21)); } }
运行结果:
cheakObjIsEqual.Stu@f87ecac
cheakObjIsEqual.Stu@f87ecac
修改输入的信息为:
1 public class Main { 2 public static void main(String[] args){ 3 System.out.println(new Stu("Xiao", 21)); 4 System.out.println(new Stu("Xiaobiqiang", 21)); 5 } 6 }
运行结果:
cheakObjIsEqual.Stu@36962eb cheakObjIsEqual.Stu@f87ecac
结果应该是hashCode决定了new运算是否会分配新的空间