黑马程序员技术交流社区
标题:
为什么:"BB".hashCode() == "Aa".hashCode() 返回true?
[打印本页]
作者:
Linuxgg
时间:
2014-4-16 16:39
标题:
为什么:"BB".hashCode() == "Aa".hashCode() 返回true?
public static void main(String[] args) {
System.out.println("BB".equals("Aa"));
System.out.println("BB".hashCode() == "Aa".hashCode());
}
复制代码
结果是
false
true
但是不明白为什么是true?
作者:
曹冬明
时间:
2014-4-16 16:59
本帖最后由 曹冬明 于 2014-4-16 19:58 编辑
hashCode
public int hashCode()
返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)
复制代码
上面是我从API中查到的String类的哈希值算法,根据上面的算法"BB"的哈希值应该是'B'*31+'B',"Aa"的哈希值是'A'*31+'a',A,B,a,b的ASCII值分别是,65,66,97,98,所以"BB"的哈希值为66*31+66正好等于"Aa"的哈希值65*31+97,我想应该是这样的!
作者:
霍振鹏
时间:
2014-4-16 17:14
楼上回答挺好的,你也可以查查源码,这个应该是凑巧了
@Override
public int hashCode() {
// BEGIN android-changed
int hash = hashCode;
if (hash == 0) {
int multiplier = 1;
int _offset = offset;
int _count = count;
char[] _value = value;
for (int i = _offset + _count - 1; i >= _offset; i--) {
hash += _value[i] * multiplier;
int shifted = multiplier << 5;
multiplier = shifted - multiplier;
}
hashCode = hash;
}
return hash;
// END android-changed
}
复制代码
根据源码也能算出来:
对于字符串“BB”:66+(32-1)*66
对于字符串 “Aa”:97+(32-1)*65
作者:
sanguodouble1
时间:
2014-4-18 13:55
因为hashCode本来就是可以相等的,hashCode,是为了程序效率而存在的,它是根据一定的算法算出来的
(如果你重新hashCode方法,这个算法可以由你说了算),然后再根据算出来的哈希码,把对象放入不同的内存中。比如有16块内存,
那就把哈希码除以16取模,
如果一个哈希码是17,一个是18,那他们就在两个不同的内存块中,比都不用比,肯定不相同
但如果一个哈希码是1,一个是17,那就在同一个内存中,就比一下,如果相同,再比equal方法
这样效率比直接比高多了,这就是哈希码可以相同,但对象仍然不同的原理
作者:
Linuxgg
时间:
2014-4-20 00:38
谢谢兄弟们,明白了。。。。
看来看源码是王道 。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2