1. 程式人生 > >[ 轉]Java hashCode() 和 equals()的若干問題解答

[ 轉]Java hashCode() 和 equals()的若干問題解答

 1 import java.util.*;
 2 import java.lang.Comparable;
 3 
 4 /**
 5  * @desc 比較equals() 返回true 以及 返回false時, hashCode()的值。
 6  *
 7  * @author skywang
 8  * @emai [email protected]
 9  */
10 public class ConflictHashCodeTest2{
11 
12     public static void main(String[] args) {
13         // 新建Person物件,
14 Person p1 = new Person("eee", 100); 15 Person p2 = new Person("eee", 100); 16 Person p3 = new Person("aaa", 200); 17 Person p4 = new Person("EEE", 100); 18 19 // 新建HashSet物件 20 HashSet set = new HashSet(); 21 set.add(p1); 22 set.add(p2); 23 set.add(p3);
24 25 // 比較p1 和 p2, 並列印它們的hashCode() 26 System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode()); 27 // 比較p1 和 p4, 並列印它們的hashCode() 28 System.out.printf("p1.equals(p4) : %s; p1(%d) p4(%d)\n", p1.equals(p4), p1.hashCode(), p4.hashCode());
29 // 列印set 30 System.out.printf("set:%s\n", set); 31 } 32 33 /** 34 * @desc Person類。 35 */ 36 private static class Person { 37 int age; 38 String name; 39 40 public Person(String name, int age) { 41 this.name = name; 42 this.age = age; 43 } 44 45 public String toString() { 46 return name + " - " +age; 47 } 48 49 /** 50 * @desc重寫hashCode 51 */ 52 @Override 53 public int hashCode(){ 54 int nameHash = name.toUpperCase().hashCode(); 55 return nameHash ^ age; 56 } 57 58 /** 59 * @desc 覆蓋equals方法 60 */ 61 @Override 62 public boolean equals(Object obj){ 63 if(obj == null){ 64 return false; 65 } 66 67 //如果是同一個物件返回true,反之返回false 68 if(this == obj){ 69 return true; 70 } 71 72 //判斷是否型別相同 73 if(this.getClass() != obj.getClass()){ 74 return false; 75 } 76 77 Person person = (Person)obj; 78 return name.equals(person.name) && age==person.age; 79 } 80 } 81 }