黑马程序员技术交流社区

标题: 简单的哈希值求解 [打印本页]

作者: aiq黑马程序员    时间: 2014-8-9 23:09
标题: 简单的哈希值求解
  1. String s="abc";
  2. String s1=new String("abc");
复制代码


比较s和s1    s==s1  是false
而哈希值为什么相等?  详细解释一下  谢谢了
作者: Bule丶    时间: 2014-8-9 23:20
哈希值是根据对象内具体的值算的,不是算的对象出来的哈希值,而s==s1比较的是内存地址,不是值,如果比较值用equals就会是true了
作者: fantacyleo    时间: 2014-8-9 23:54
Object类中,hashCode的值是对象所在的内存地址,equals比较依据的也是内存地址,此时== equals hashCode三者的结果是一致的。但是,String重写了hashCode和equals方法,其结果不再和==保持一致。对于String s="abc"; s指向的是常量池中的对象"abc",而String s1=new String("abc");指向的是堆内存中的一个字符串对象"abc",==比较,二者不相等。而String类的hashCode和equals比较的是字符串是否包含相同的字符序列,因此二者有相同的hashCode,且equals比较为真
作者: aiq黑马程序员    时间: 2014-8-10 21:17
fantacyleo 发表于 2014-8-9 23:54
Object类中,hashCode的值是对象所在的内存地址,equals比较依据的也是内存地址,此时== equals hashCode三 ...

==和equals懂了 但是哈希值相等还是没明白
作者: fantacyleo    时间: 2014-8-10 21:28
aiq黑马程序员 发表于 2014-8-10 21:17
==和equals懂了 但是哈希值相等还是没明白

API文档中建议对equals为true的两个对象其hashCode也返回相同的值。String作为官方自带类,自然是会遵守这个约定的。
作者: /aiq玩完?/aiq    时间: 2014-8-10 21:42
==比较的是两个对象的地址值,而楼主的s和s1的值是相等的也就是说s.equals(s1)返回true,那么两个对象的值相等,哈希值必然相同。两个哈希值相同的对象值不一定相同,而相同的两个对象值哈希值一定相同
作者: Justfeeling    时间: 2014-8-10 21:46
引用==引用  比较的是内存的真实地址
基本==基本  具体的数值




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2