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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© doomsday 高级黑马   /  2015-2-5 16:54  /  2510 人查看  /  23 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  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是判断的什么?

23 个回复

倒序浏览
本帖最后由 天堂雨 于 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。

回复 使用道具 举报
天堂雨 发表于 2015-2-5 17:03
对象==对象,是比较的两个对象的哈希值是否相同"aaa"是String对象,一但创建就不会发生改变,
String s1 =  ...

s1,s2,s3的hashCode()都是一样的
回复 使用道具 举报
doomsday 发表于 2015-2-5 17:17
s1,s2,s3的hashCode()都是一样的

嗯 我理解错了 不是比较哈希值,是内存地址。我一直以为哈希值就是内存地址值。。。
回复 使用道具 举报
天堂雨 发表于 2015-2-5 17:26
嗯 我理解错了 不是比较哈希值,是内存地址。我一直以为哈希值就是内存地址值。。。 ...

那哥们!内存地址值和hash值有啥不一样,怎样才能查看内存地址值
回复 使用道具 举报
String s1 = "aaa";执行这条语句时:会在栈内存中开辟空间来存储s1变量;会在堆内存中开辟空间来存储对象“aaa”(字符串就是对象哦)。而s1变量存储的值就是“aaa”在堆内存中的首地址值(例如:0x0012)。
String s1 = "aaa";
String s2 = "aaa";
这样其实在堆内存中就有两个对象,所以s1和s2存储的地址值是不一样的。
所以个人觉得:s1==s2比较的是s1和s2所引用的对象的首地址值。
回复 使用道具 举报
==是判断地址是否相同,s1和s2在方法区是同一块内存,但是s3在堆中重新new出了一块内存,故04行返回false
回复 使用道具 举报
判断s1 和s3的 地址值 是否相等!!
回复 使用道具 举报
判断地址值!
回复 使用道具 举报
==判断地址值,equals判断真实的数据值
回复 使用道具 举报

看我的图,很明了。

回复 使用道具 举报 3 0
equals(Object   o)默认比较的也是地址值。要比较内容需要重写equals方法

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

小Q截图-20150126101644.png
回复 使用道具 举报 1 0
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。
希望能帮助到你~~
回复 使用道具 举报
==比较的是地址值,equals没重写默认比较的元素地址值,重写了按重写以后的比较
回复 使用道具 举报
判断的是地址值吧~~~s1 是字符串池中的aaa,s3是在对内存中创建了一个新对象
回复 使用道具 举报
比较对象内存地址值
回复 使用道具 举报
万合天宜 发表于 2015-2-6 10:20
看我的图,很明了。

支持,就是这个意思
回复 使用道具 举报
万合天宜 发表于 2015-2-6 10:20
看我的图,很明了。

很好 赞个
回复 使用道具 举报
==比较的是地址  new string()赋值和""赋值的地址一定是不同的
你可以看看我的博客
http://blog.csdn.net/d342784178/article/details/43195233
回复 使用道具 举报
比较的是字符对象的地址,而s1,s3是不同的对象,但s1,s2是同一个对象
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马