A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public static void main(String[] args) {

  2.                 System.out.println("BB".equals("Aa"));
  3.                 System.out.println("BB".hashCode() == "Aa".hashCode());

  4.         }
复制代码


结果是
false
true

但是不明白为什么是true?

4 个回复

倒序浏览
本帖最后由 曹冬明 于 2014-4-16 19:58 编辑
  1. hashCode

  2. public int hashCode()
  3. 返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
  4. s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

  5. 使用 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,我想应该是这样的!

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报 2 0
楼上回答挺好的,你也可以查查源码,这个应该是凑巧了
  1. @Override
  2.     public int hashCode() {
  3.         // BEGIN android-changed
  4.         int hash = hashCode;
  5.         if (hash == 0) {
  6.             int multiplier = 1;
  7.             int _offset = offset;
  8.             int _count = count;
  9.             char[] _value = value;
  10.             for (int i = _offset + _count - 1; i >= _offset; i--) {
  11.                 hash += _value[i] * multiplier;
  12.                 int shifted = multiplier << 5;
  13.                 multiplier = shifted - multiplier;
  14.             }
  15.             hashCode = hash;
  16.         }
  17.         return hash;
  18.         // END android-changed
  19.     }
复制代码


根据源码也能算出来:
对于字符串“BB”:66+(32-1)*66
对于字符串 “Aa”:97+(32-1)*65

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
因为hashCode本来就是可以相等的,hashCode,是为了程序效率而存在的,它是根据一定的算法算出来的
(如果你重新hashCode方法,这个算法可以由你说了算),然后再根据算出来的哈希码,把对象放入不同的内存中。比如有16块内存,
那就把哈希码除以16取模,
如果一个哈希码是17,一个是18,那他们就在两个不同的内存块中,比都不用比,肯定不相同
但如果一个哈希码是1,一个是17,那就在同一个内存中,就比一下,如果相同,再比equal方法

这样效率比直接比高多了,这就是哈希码可以相同,但对象仍然不同的原理

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢兄弟们,明白了。。。。

看来看源码是王道 。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马