网上有很多对这几个的说明,说的也不详尽,笼统,很多初期开发者看完后也等于没看
equals ():这个方法是Object里面的方法,在他的子类没有重写的情况下,他的实现是:当两个对象的内存地址是一样的,那返回值就是true,否则返回false,但也有子类重写这个方法的情况,比如String ,他重写后的实现是这样的
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = length(); if (n == anotherString.length()) { int i = 0; while (n-- != 0) { if (charAt(i) != anotherString.charAt(i)) return false; i++; } return true; } } return false; }
明显看到,他的实现是比较实际的字符串是否相等。
==:这个就是比较两个对象的内存地址是否相等的
hashCode():在没有重写的情况下,他的实现是:返回对象的 内存地址经过处理后的结构,所以由于每个对象的内存地址都不一样,所以哈希码也不一样。但是String是重写过这个方法的,他的实现是
public int hashCode() { int h = hash; final int len = length(); if (h == 0 && len > 0) { for (int i = 0; i < len; i++) { h = 31 * h + charAt(i); } hash = h; } return h; }
也就是当一个字符串是一样的话,他的equals()和hashCode()都返回true,其他Object的子类重写的情况就不做探讨
把这个代码测试一下就一目了然了:
String a=new String("a"); String b=new String("a"); System.out.println(a==b); System.out.println(a.equals(b)); System.out.println(a.hashCode()); System.out.println(b.hashCode());