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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aiq黑马程序员 中级黑马   /  2014-8-9 23:09  /  1174 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. String s="abc";
  2. String s1=new String("abc");
复制代码


比较s和s1    s==s1  是false
而哈希值为什么相等?  详细解释一下  谢谢了

6 个回复

倒序浏览
哈希值是根据对象内具体的值算的,不是算的对象出来的哈希值,而s==s1比较的是内存地址,不是值,如果比较值用equals就会是true了
回复 使用道具 举报
Object类中,hashCode的值是对象所在的内存地址,equals比较依据的也是内存地址,此时== equals hashCode三者的结果是一致的。但是,String重写了hashCode和equals方法,其结果不再和==保持一致。对于String s="abc"; s指向的是常量池中的对象"abc",而String s1=new String("abc");指向的是堆内存中的一个字符串对象"abc",==比较,二者不相等。而String类的hashCode和equals比较的是字符串是否包含相同的字符序列,因此二者有相同的hashCode,且equals比较为真
回复 使用道具 举报 2 0
fantacyleo 发表于 2014-8-9 23:54
Object类中,hashCode的值是对象所在的内存地址,equals比较依据的也是内存地址,此时== equals hashCode三 ...

==和equals懂了 但是哈希值相等还是没明白
回复 使用道具 举报
aiq黑马程序员 发表于 2014-8-10 21:17
==和equals懂了 但是哈希值相等还是没明白

API文档中建议对equals为true的两个对象其hashCode也返回相同的值。String作为官方自带类,自然是会遵守这个约定的。
回复 使用道具 举报
==比较的是两个对象的地址值,而楼主的s和s1的值是相等的也就是说s.equals(s1)返回true,那么两个对象的值相等,哈希值必然相同。两个哈希值相同的对象值不一定相同,而相同的两个对象值哈希值一定相同
回复 使用道具 举报
引用==引用  比较的是内存的真实地址
基本==基本  具体的数值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马