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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© oath 中级黑马   /  2013-9-18 19:18  /  2475 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 oath 于 2013-10-14 14:49 编辑

已知的是,hash码不是内存地址值,而是根据内存地址值算出来的,那么==到底比较的是hash码,还是真正的内存地址呢?
求答案和答案分析,或者出处

9 个回复

倒序浏览
不管比较什么类型 ==都是比较的内存地址
回复 使用道具 举报
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
回复 使用道具 举报
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
回复 使用道具 举报
==用于比较引用和比较基本数据类型的时候功能不同,当比较基本数据类型的时候比较的是值是否相等,相等就返回true否则返回false 比较引用的是就是比较是不是内存中的同一个对象也就是物理地址。比如说
  1. String str1 = new String("abc");
  2. String str2 ="abc";
  3. str1=="abc";返回的是false
  4. 但是 str2=="abc";返回的是true
复制代码
回复 使用道具 举报
"=="只比较内存地址经过特定算法翻译过来的hash码值,不会去比较内存的真实地址,因为同一个内存真实地址存储不同对象时翻译后的hash码也是不同的,所以要比较两个对象是否相同不能单靠比较内存真实地址是否相同.
比如:new Integer(1)对象在每次被执行时都被保存在内存的不同位置,但该对象计算出来的hash码值总是1,其他基本数据类型也是如此.

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
两种情况:
基础数据类型比较的时候,==只比较两者的值,而不关心其在内存的情况和hash值;
引用数据类型比较的时候,==比较两者的内存地址,即必须是指向同一个内存地址的两个引用才会返回true,鉴于此,当然hash值也是必然相等的,否则就是false;

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 简单ai... 于 2013-9-24 11:39 编辑

==和equals是有区别的,在字符串比较的情况下,前者是比较两个字符串变量所指向的内存地址是否相同,而后者是比较两个字符串变量的值是否相同
只有在整型比较的时候,==和equals才是相等的
回复 使用道具 举报
== 表示相等,可以比较值,也可以比较引用
回复 使用道具 举报
Object类中的equals方法
     equals比较两个对象的地址值,毫无意义
       子类应该覆盖equals方法,建立子类自己独特比较方式
       == 和equals方法
       == 在基本数据类型中,比较的是变量的实际值
       == 在引用数据类型中,比较的是引用类型的地址值
       equals方法,比较的也是引用类型的地址值
       equals方法,可以自定义对象的比较方式

评分

参与人数 1技术分 +1 收起 理由
黄文伯 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马