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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山里孩子 中级黑马   /  2015-3-24 23:07  /  1291 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天老师讲的这个题 有点....出来分享下啦.看下输出结果是什么?


  1. class  StringTest2
  2. {
  3.      public static void main(String[] args)
  4.      {
  5.           String s1 = "a";
  6.           String s2 = "b";
  7.           String s3 = "ab";

  8.           System.out.println(s3 == s1 + s2);
  9.           System.out.println(s3 == "a" + "b");
  10.      }
  11. }
复制代码




评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1

查看全部评分

4 个回复

倒序浏览
额,依稀记得视频里老师说过,s3==s1+s2中s1,s2,s3表示的是地址。所以结果是false。
s3==“a”+“b”就是判断的字符串了,所以结果是true。
不知道我记得对不对。{:3_66:}
回复 使用道具 举报
当我们使用字符串的时候,==是比较的两个字符串是不是指向同一个对象。程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(比如说,题目中的“a”,“b”“ab”)放入字符串缓冲池中。现在我们将题中的“a”+“b”赋值给String 类型的s4,我们在创建字符串的时候,程序会首先在这个stirng缓冲池中寻找是否有相同值得对象,所以在进行“a”+“b”的时候,程序找到了“ab”,这时我们就将s4指向了“ab”,所以,现在“ab”就与s4指向了同一个对象,所以就会输出“true”。
但是,我们在进行变量的运算时,就不一样了,在进行s1 + s2的时候,他们会将得到的字符串对象储存在各自的内存中,而不是放在缓冲池中。尽管结果是一样的,但是因为不是指向同一个对象的原因,所以就有了两个不同的结果。我记得在视频中有涉及到类似的问题啊!

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
要不怎么有个字符串常量的名称!还有你标题讲byte类型,题目却是String……
回复 使用道具 举报
在执行字符串的加法的时候编译器直接将数值加在一起在运算的
用反编译工具打开
s3 == "a" + "b"
其实是
s2 == "ab"
是加在一起了再做运算的.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马