黑马程序员技术交流社区

标题: 关于String对象在内存中的问题 [打印本页]

作者: 冒牌高手    时间: 2014-9-1 22:16
标题: 关于String对象在内存中的问题
请大神解释下以下代码的结果...

  1. String s1="a";
  2.                 String s2="b";
  3.                 String s3="ab";
  4.                 String s4=s1+s2;
  5.                 System.out.println((s1+s2)==("a"+"b"));
  6.                 System.out.println((s1+s2)=="ab");
  7.                 System.out.println(s3==("a"+"b"));
  8.                 System.out.println(s3=="ab");
  9.                 System.out.println(s4==("a"+"b"));
  10.                 System.out.println(s4=="ab");
复制代码




作者: 她只是过客    时间: 2014-9-2 08:45
{:2_31:}是和常量池有关系吗,早忘记了
作者: 暴走的小青春丶    时间: 2014-9-2 13:27
S4必须要初始化才能知道结果,不存放在常量池里,上面的存放在产量池中,可以加final解决
作者: 旭辉lin    时间: 2014-9-3 16:25
涉及到变量的运算,都在各自的内存中运行,但是串池(确切的说是常量池)的操做是按照拼接的形式。
题中的s1,s2,s3都是指向串池的引用,但是s4不一样,操作的是变量啊,所以s4和别人比较都是false,
(s1+s2)同理还是在操作变量,开辟内存,但是"a"+"b"就是在操作串池,拼接几就是几。
所以比较结果是false
s3不一样,s3是直接指向了常量池,所以只要内容吻合了就为true


作者: 冒牌高手    时间: 2014-9-8 15:25
旭辉lin 发表于 2014-9-3 16:25
涉及到变量的运算,都在各自的内存中运行,但是串池(确切的说是常量池)的操做是按照拼接的形式。
题中的s1, ...

我知道规律,但是不知道在内存中到底发生了什么...
作者: 旭辉lin    时间: 2014-9-8 19:03
冒牌高手 发表于 2014-9-8 15:25
我知道规律,但是不知道在内存中到底发生了什么...

再往里就要涉及到内存的分配问题,太高深,不晓得了。




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