hashcode(),equals()和==的区别
- 1、 所有的对象都继承object,自带的equal就是==
public boolean equals(Object obj) {
return (this == obj);
不过string这个类是个例外,它会比较每个字符是否相等
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
看看string中的hashcode()是怎么实现的
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
可以发现这个hashcode值是跟其内容相关的
2、 equals()相同hashcode()也要相同,hashcode相同equals不一定相同
3、一个对象的equals方法被重写时hashcode方法也要重写
因为hashcode是用在存放数据时使用的一个标记值,比如set是不能存放相同元素的,会根据hashcode判断数据存放的位置,如果这个位置有元素了,但是仍不能判断这个两个元素是否相同,还要判断equals是否相同,相同就认为是一个元素不能再放进去了,不同-说明是不同的元素,会继续存放在这个位置上。