java基础一
java中==和equals和hashCode的区别
在JAVA中利用"=="比较变量时,系统使用变量在栈中所存的值作为比较的依据。
equals:
equals是Object类提供的方法之一,默认的 equals方法实现如下
public boolean equals(Object obj) {
return (this == obj);
}
}
总结: ==和equals意思一样,但equals只能给对象使用。
equals和hashCode()
java.lnag.Object中对hashCode的约定:
1、equals()为true,则hashCode方法必须产生相同的整数结果
2、equals()方法是不相等的,则hashCode()可能产生相同的整数结果。但如果能不同,则可能提高散列表的性能。
重写equals的原则:
重写equals()方法的类不作为集合类的key值,则可以不重写hashCode()方法
Map/Set的key为自定义对象时,则必须重写equals和hashCode。
hashcode()和equals()的作用:
HashMap是基于散列函数,以数组和链表的方式实现的,数组的每个元素是一个链表。
查询key-value的方式是先根据key的hashcode来定位到是哪个链表,然后在该链表中用equals()来依次进行比较。
比如
Stirng a1 = new String("a");
String a2 = new String("a");
String value = "value";
<a1, value> <a2, value>这两个对象存入到hashMap中是相等的。
但如果你不重写 String的hashcode()方法的话,结果通常是不相等的。
HashMap查找key对应的value是这样的,先求出key的hashcode()%(bucket大小) 找到是哪个链表,再使用key.equals(),若相等则认为找到。
如果不重写String的hashcode()方法, 那么a1和a2的hash值不同,在查找hash表时会出现a1对应的链表不同于a2对应的链表。
String中重写了equals()和hashcode(),所以平常我们使用它作为key值才不会出错
public final class String ... { public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = count; if (n == anotherString.count) { int i = 0; while (n-- != 0) { if (charAt(i) != anotherString.charAt(i)) return false; i++; } return true; } } return false; } //s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 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; } }

浙公网安备 33010602011771号