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運算是否會分配新的空間
