黑马程序员技术交流社区

标题: Byte常量在内存中存储位置 [打印本页]

作者: 山里孩子    时间: 2015-3-24 23:07
标题: Byte常量在内存中存储位置
今天老师讲的这个题 有点....出来分享下啦.看下输出结果是什么?


  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. }
复制代码





作者: 有丶时候    时间: 2015-3-25 00:28
额,依稀记得视频里老师说过,s3==s1+s2中s1,s2,s3表示的是地址。所以结果是false。
s3==“a”+“b”就是判断的字符串了,所以结果是true。
不知道我记得对不对。{:3_66:}
作者: 妖妖    时间: 2015-3-25 00:33
当我们使用字符串的时候,==是比较的两个字符串是不是指向同一个对象。程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(比如说,题目中的“a”,“b”“ab”)放入字符串缓冲池中。现在我们将题中的“a”+“b”赋值给String 类型的s4,我们在创建字符串的时候,程序会首先在这个stirng缓冲池中寻找是否有相同值得对象,所以在进行“a”+“b”的时候,程序找到了“ab”,这时我们就将s4指向了“ab”,所以,现在“ab”就与s4指向了同一个对象,所以就会输出“true”。
但是,我们在进行变量的运算时,就不一样了,在进行s1 + s2的时候,他们会将得到的字符串对象储存在各自的内存中,而不是放在缓冲池中。尽管结果是一样的,但是因为不是指向同一个对象的原因,所以就有了两个不同的结果。我记得在视频中有涉及到类似的问题啊!
作者: 和谐木马    时间: 2015-3-25 00:50
要不怎么有个字符串常量的名称!还有你标题讲byte类型,题目却是String……
作者: 圣光忏悔    时间: 2015-3-25 14:29
在执行字符串的加法的时候编译器直接将数值加在一起在运算的
用反编译工具打开
s3 == "a" + "b"
其实是
s2 == "ab"
是加在一起了再做运算的.




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