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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _etc   /  2015-3-28 22:03  /  1429 人查看  /  27 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。

评分

参与人数 1黑马币 +20 收起 理由
Captain_Jack_Sp + 20

查看全部评分

回复 使用道具 举报
本帖最后由 xj刘博 于 2015-3-31 13:36 编辑
  1. <div class="blockcode"><blockquote>

  2. public class Text {
  3.         public static void main(String[] args) {
  4.                 String s1 = "a";// s1是一个类的类型变量,“a”是一个对象
  5.                 // 初始化后要为a在内存中开辟一个空间
  6.                 String s2 = "b";
  7.                 String s3 = "ab";
  8.                 System.out.println(s3 == s1 + s2);// 这里比较的是内存地址,所以为false
  9.                 System.out.println(s3 == "a" + "b");// 这里比较的是常量的值,因为a和b已经在常量池中存在了,
  10.                                            //所以就不会为s3中的ab单独开辟空间了,a和b会直接指向ab,所以相等
  11.         }                                   
  12. }
复制代码


回复 使用道具 举报
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。
回复 使用道具 举报
当我们使用字符串的时候,==是比较的两个字符串是不是指向同一个对象。程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(比如说,题目中的“a”,“b”“ab”)放入字符串缓冲池中。现在我们将题中的“a”+“b”赋值给String 类型的s4,我们在创建字符串的时候,程序会首先在这个stirng缓冲池中寻找是否有相同值得对象,所以在进行“a”+“b”的时候,程序找到了“ab”,这时我们就将s4指向了“ab”,所以,现在“ab”就与s4指向了同一个对象,所以就会输出“true”。
但是,我们在进行变量的运算时,就不一样了,在进行s1 + s2的时候,他们会将得到的字符串对象储存在各自的内存中,而不是放在缓冲池中。尽管结果是一样的,但是因为不是指向同一个对象的原因,所以就有了两个不同的结果。我记得在视频中有涉及到类似的问题啊!
回复 使用道具 举报
受教了,感谢楼主分享
回复 使用道具 举报
可以按楼上说的试着用equals一下。。。。
回复 使用道具 举报
这里的s1 , s2 都是对象 ,所以s3 == s1 + s2 只是判断s3与( s1 + s2 )是否是同一个内存地址。
判断内容是否相同应该用s3.equals(s1 + s2)  。,这个地方好像是错的啊,,,兄弟

评分

参与人数 1黑马币 +20 收起 理由
_etc + 20

查看全部评分

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