1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value; }可以看到由于调用的getNode方法
final Node<K,V> getNode(int hash, Object key) { Node<K,V>[] tab; Node<K,V> first, e; int n; K k; //判断是否为第一个元素相等,并且是hashCode和equals方法是否相等 if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) { if (first.hash == hash && // always check first node ((k = first.key) == key || (key != null && key.equals(k)))) return first; //判断其第一个元素不为空,则循环 if ((e = first.next) != null) { if (first instanceof TreeNode) return ((TreeNode<K,V>)first).getTreeNode(hash, key); //循环获取key,如果key的hash值等于其hash值并且((key值==e.key)或者key的equals方法==k) do { if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } while ((e = e.next) != null); } } return null; }从上面代码可只,如果其两个对象hashcode相等的并且返回两个相等值有以下两个条件:
public static class User{ private String name; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(name, user.name); } public User(String name) { this.name = name; } } public static void main(String[] args) { User user=new User("demo"); User user2=new User("demo"); System.out.println(user.hashCode()==user2.hashCode());//false System.out.println(user.equals(user2));//true }由上可知:以上四个选项均无正确答案:
1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
public class text { public static void main(String[] args){ a a = new a(); a a1 = new a(); System.out.println(a.equals(a1));//true //二者hashCode值不同 System.out.println(a.hashCode()); System.out.println(a1.hashCode()); } } class a { @Override public boolean equals(Object obj) { return true; } }
下面几组的hashCode均相等
"柳柴"与"柴柕" hashCode=851553
"志捘"与"崇몈" hashCode=786017
AB错
public boolean equals(Object var1) { if (this == var1) { //两个对象是否相同 return true; } else { if (var1 instanceof String) { //看看var是不是 String类型 String var2 = (String)var1; int var3 = this.value.length; if (var3 == var2.value.length) { //判断4长度是否相同 char[] var4 = this.value; char[] var5 = var2.value; for(int var6 = 0; var3-- != 0; ++var6) { //每个字符数组 构成字符串 if (var4[var6] != var5[var6]) { //匹配每个字符 return false; } } return true; } } return false; } }
private int hash; public int hashCode() { int var1 = this.hash;//赋值对象中原有的变量hash if (var1 == 0 && this.value.length > 0) {//如果原本没有hash则生成 char[] var2 = this.value; for(int var3 = 0; var3 < this.value.length; ++var3) { var1 = 31 * var1 + var2[var3]; } this.hash = var1; } return var1; }我们可以看出每生成一个类的hashCode都会保存到对象中,以后再获取都是同一个