黑马程序员技术交流社区

标题: 两个对象==是判断的什么 [打印本页]

作者: doomsday    时间: 2015-2-5 16:54
标题: 两个对象==是判断的什么
  1. String s1 = "aaa";
  2. String s2 = "aaa";
  3. String s3 = new String("aaa");
  4. System.out.println(s1==s3); //false
  5. System.out.println(s1==s2); //true
  6. System.out.println(s1.equals(s3));//true 比较的是字符串的值
复制代码

求解s1==s3是判断的什么?
作者: 天堂雨    时间: 2015-2-5 17:03
本帖最后由 天堂雨 于 2015-2-5 17:10 编辑

对象==对象,是比较的两个对象的哈希值是否相同"aaa"是String对象,一但创建就不会发生改变,
String s1 = "aaa";
String s2 = "aaa";
就是将"aaa"这个对象分别付给了s1和s2两个引用,也就是说s1和s2 都指向了"aaa"这个对象,所以s1==s2是ture。
但是String s3 = new String("aaa");就又产生了一个"aaa"字符串对象,这个和前面那个是不同的两个对象,所以是false。


作者: doomsday    时间: 2015-2-5 17:17
天堂雨 发表于 2015-2-5 17:03
对象==对象,是比较的两个对象的哈希值是否相同"aaa"是String对象,一但创建就不会发生改变,
String s1 =  ...

s1,s2,s3的hashCode()都是一样的
作者: 天堂雨    时间: 2015-2-5 17:26
doomsday 发表于 2015-2-5 17:17
s1,s2,s3的hashCode()都是一样的

嗯 我理解错了 不是比较哈希值,是内存地址。我一直以为哈希值就是内存地址值。。。
作者: doomsday    时间: 2015-2-5 17:35
天堂雨 发表于 2015-2-5 17:26
嗯 我理解错了 不是比较哈希值,是内存地址。我一直以为哈希值就是内存地址值。。。 ...

那哥们!内存地址值和hash值有啥不一样,怎样才能查看内存地址值
作者: zhengyijun    时间: 2015-2-5 18:28
String s1 = "aaa";执行这条语句时:会在栈内存中开辟空间来存储s1变量;会在堆内存中开辟空间来存储对象“aaa”(字符串就是对象哦)。而s1变量存储的值就是“aaa”在堆内存中的首地址值(例如:0x0012)。
String s1 = "aaa";
String s2 = "aaa";
这样其实在堆内存中就有两个对象,所以s1和s2存储的地址值是不一样的。
所以个人觉得:s1==s2比较的是s1和s2所引用的对象的首地址值。

作者: Julie    时间: 2015-2-6 01:39
==是判断地址是否相同,s1和s2在方法区是同一块内存,但是s3在堆中重新new出了一块内存,故04行返回false
作者: @coffee    时间: 2015-2-6 01:44
判断s1 和s3的 地址值 是否相等!!
作者: jiangwenjun    时间: 2015-2-6 02:51
判断地址值!
作者: kfcka    时间: 2015-2-6 09:08
==判断地址值,equals判断真实的数据值
作者: 万合天宜    时间: 2015-2-6 10:20

看我的图,很明了。


作者: Piaget    时间: 2015-2-6 21:52
equals(Object   o)默认比较的也是地址值。要比较内容需要重写equals方法

小Q截图-20150126101644.png (93.96 KB, 下载次数: 40)

小Q截图-20150126101644.png

作者: qiuyuhuaihua    时间: 2015-2-6 23:31
String String s1 = "aaa";
String s2 = "aaa";(String s3 = new String("aaa"); 创建的 s3 和 s2 的用处是一样的)
s1 和 s2 是两个String类型的引用
1、调用 s1 == s2 时,它要返回的是一个 boolean 的值,判断的依据是 s1 和 s2 在内存中的地址,不同的变量在内存中的地址肯定是不同的,所以理所当然的返回一个 false。
2、然后调用 s1.equals(s2) 时,就利用到了重载的技术,我们知道 equals() 是 Object 中的成员函数,但是所有的类都是 Object 的子类,String 也不例外,但是 String 类型在继承 Object 类时还重载了 equals() 方法,使在比较时不再比较内存地址,而是比较自己维护的一连串字符, s1 和 s2 维护的一串字符都是“aaa”,所以此方法的返回值是 true。
希望能帮助到你~~
作者: 白衣布士    时间: 2015-2-7 00:11
==比较的是地址值,equals没重写默认比较的元素地址值,重写了按重写以后的比较
作者: ㏒假™面具    时间: 2015-2-7 01:27
判断的是地址值吧~~~s1 是字符串池中的aaa,s3是在对内存中创建了一个新对象
作者: clairetoto2012    时间: 2015-2-7 07:44
比较对象内存地址值
作者: mengxiang1993    时间: 2015-2-7 07:50
万合天宜 发表于 2015-2-6 10:20
看我的图,很明了。

支持,就是这个意思
作者: huangchunwei    时间: 2015-2-7 09:03
万合天宜 发表于 2015-2-6 10:20
看我的图,很明了。

很好 赞个
作者: d342784178    时间: 2015-2-7 10:23
==比较的是地址  new string()赋值和""赋值的地址一定是不同的
你可以看看我的博客
http://blog.csdn.net/d342784178/article/details/43195233
作者: franksight    时间: 2015-2-7 11:35
比较的是字符对象的地址,而s1,s3是不同的对象,但s1,s2是同一个对象
作者: xiaoyi    时间: 2015-2-7 12:12
万合天宜 发表于 2015-2-6 10:20
看我的图,很明了。

原来这就是说new string有两个对象的原因,原来在方法区
作者: 边晓炎    时间: 2015-2-7 12:41
比较对象指引的地址!!
作者: lwh316658735    时间: 2015-2-7 13:37
楼主这是基础没打好,建议去看看视频,这么简单的问题有点怀疑是水贴。
作者: 天堂雨    时间: 2015-2-7 15:36
doomsday 发表于 2015-2-5 17:35
那哥们!内存地址值和hash值有啥不一样,怎样才能查看内存地址值

java语言不能直接操作物理内存,所以你不能查看内存地址值。




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