黑马程序员技术交流社区

标题: 一个比较的问题 [打印本页]

作者: 袁劲松    时间: 2014-1-13 09:59
标题: 一个比较的问题
int  a=10;   
int  b=10;   
  则a==b将是true。   
String  a=new  String(foo);   
String  b=new  String(foo);   
  则a==b将返回false。   
这个原因是什么呢
作者: xu6148152    时间: 2014-1-13 10:02
本帖最后由 xu6148152 于 2014-1-13 10:04 编辑

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

作者: 长石    时间: 2014-1-13 10:16
==比较的是变量值,就是引用地址
而new是开辟新空间 所以地址不同
这里要用equals比较
作者: 高丽华    时间: 2014-1-13 11:08
==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

作者: 悟中生有    时间: 2014-1-13 11:37
你new了两个对象,在内存里就会有两个地址值,任何对象的地址值在内存中都是唯一的。所以比较结果就是false了。
作者: app297    时间: 2014-1-14 12:17
对的, new了2个对象,所以返回是alse, == 是比较内存地址,而且String 和 基本数据类型不一样。 String是不能改变的。只是引用地址改变而已
作者: 倉促、尋找你    时间: 2014-1-15 21:23
你不了解的JVM的工作机制,对象表示符就如C里边的指针,只是相当于对象数据的地址而已,不是对象的值




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