1 2 public class Equals_HashCode { 3 public static void main(String[] args) { 4 // 1. '=='是用来比较两个变量(基本类型和对象类型)的值是否相等的, 5 // 如果两个变量是基本类型的,那很容易,直接比较值就可以了 6 // 如果两个变量是对象类型的,那么它还是比较值, 7 // 只是它比较的是这两个对象在栈中的引用(即地址) 8 // 对象是放在堆中的,栈中存放的是对象的引用(地址)。 9 // 由此可见'=='是对栈中的值进行比较的。 10 // 如果要比较堆中对象的内容是否相同,那么就要重写equals方法了 11 // 2. Object类中的equals方法就是用'=='来比较的: 12 // public boolean equals(Object obj) { 13 // return (this == obj); 14 // } 15 // 所以如果没有重写equals方法,equals和==是等价的。 16 // 通常我们会重写equals方法,让equals比较两个对象的内容,而不是比较对象的引用(地址) 17 // 因为往往我们觉得比较对象的内容是否相同比比较对象的引用(地址)更有意义 18 // 3. Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看) 19 // 所以如果没有重写hashCode方法,任何对象的hashCode都是不相等的。 20 // 通常在集合类的时候需要重写hashCode方法和equals方法, 21 // 因为如果需要给集合类(比如:HashSet)添加对象, 22 // 那么在添加之前需要查看给集合里是否已经有了该对象, 23 // 比较好的方式就是用hashCode。 24 // 4. 注意的是String、Integer、Boolean、Double等这些类都重写了equals和hashCode方法 25 // 这两个方法是根据对象的内容来比较和计算hashCode的。(详细可以查看jdk下的String.java源代码) 26 // 所以只要对象的基本类型值相同,那么hashcode就一定相同。 27 // 5. equals()相等的两个对象,hashcode()一定相等; 28 // equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。 29 // 换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 30 // (我的理解是由于哈希码在生成的时候产生冲突造成的)。 31 // 反过来:hashcode()不等,一定能推出equals()也不等; 32 // hashcode()相等,equals()可能相等,也可能不等。 33 // 在object类中,hashcode()方法是本地方法,返回的是对象的引用(地址值), 34 // 而object类中的equals()方法比较的也是两个对象的引用(地址值), 35 // 如果equals()相等,说明两个对象地址值也相等, 36 // 当然hashcode()也就相等了; 37 38 39 40 String a = new String("str"); 41 String b = new String("str"); 42 System.out.println(a==b); 43 System.out.println(a.equals(b)); 44 System.out.println(a.hashCode()); 45 System.out.println(b.hashCode()); 46 System.out.println(); 47 // false 48 // true 49 // 114225 50 // 114225 51 // (使用equals比较结果为是因为String类中重写了equals方法, 52 // 其方法体是比较String中每个字符是否相等。 53 // 二者的hashcode相同是因为String类重写了hashcode方法, 54 // 其方法体是根据String中所有字符计算出一个int作为hashcode) 55 56 class A{ 57 String str; 58 int i; 59 public A(String str, int i) { 60 super(); 61 this.str = str; 62 this.i = i; 63 } 64 } 65 A aA = new A("str",1); 66 A bA = new A("str",1); 67 System.out.println(aA==bA); 68 System.out.println(aA.equals(bA)); 69 System.out.println(aA.hashCode()); 70 System.out.println(bA.hashCode()); 71 System.out.println(); 72 // false 73 // false 74 // 6413875 75 // 21174459 76 // (由于类A没有重写equals和hashCode, 77 // 所以其equals和hashCode依然是使用Object类的equals和hashCode方法) 78 79 class B{ 80 String str; 81 public B(String str){ 82 this.str = str; 83 } 84 } 85 B aB = new B("str"); 86 B bB = new B("str"); 87 System.out.println(aB==bB); 88 System.out.println(aB.equals(bB)); 89 System.out.println(aB.hashCode()); 90 System.out.println(bB.hashCode()); 91 System.out.println(); 92 // false 93 // false 94 // 827574 95 // 17510567 96 97 class C{ 98 int i; 99 public C(int i){ 100 this.i = i; 101 } 102 } 103 C aC = new C(1); 104 C bC = new C(1); 105 System.out.println(aC==bC); 106 System.out.println(aC.equals(bC)); 107 System.out.println(aC.hashCode()); 108 System.out.println(bC.hashCode()); 109 System.out.println(); 110 // false 111 // false 112 // 27744459 113 // 28737396 114 } 115 116 } 117 |
如有不对的地方敬请指出~~