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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁劲松 中级黑马   /  2014-1-13 09:59  /  1271 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int  a=10;   
int  b=10;   
  则a==b将是true。   
String  a=new  String(foo);   
String  b=new  String(foo);   
  则a==b将返回false。   
这个原因是什么呢

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 淡定

查看全部评分

6 个回复

倒序浏览
本帖最后由 xu6148152 于 2014-1-13 10:04 编辑

a,b是两个不同的对象,指向两片不同的内存区域。new运算符会在堆内存中开辟一个空间,用来存放对象的属性。
因此new String(a),new String(b),会在堆内存中开辟两个内存空间。
而a,b分别指向各自的内存空间地址。

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
Sa_La + 1
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
==比较的是变量值,就是引用地址
而new是开辟新空间 所以地址不同
这里要用equals比较
回复 使用道具 举报
==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
回复 使用道具 举报
你new了两个对象,在内存里就会有两个地址值,任何对象的地址值在内存中都是唯一的。所以比较结果就是false了。
回复 使用道具 举报
对的, new了2个对象,所以返回是alse, == 是比较内存地址,而且String 和 基本数据类型不一样。 String是不能改变的。只是引用地址改变而已
回复 使用道具 举报
你不了解的JVM的工作机制,对象表示符就如C里边的指针,只是相当于对象数据的地址而已,不是对象的值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马