黑马程序员技术交流社区

标题: 再谈关于String 存储问题!!!!求深入 [打印本页]

作者: 徐慧书    时间: 2012-5-3 20:10
标题: 再谈关于String 存储问题!!!!求深入
先来个列子,String s1 = "a" + new String("bc");
我们知道串 "a" 是会在String pool 中开辟一块存储区来存,并提供它的首地址,
而 new String("bc") 则先在String pool中开辟存储空间来存储"bc" 在堆内存中new 一块内存并拷贝"bc" 放在该内存中。
问题:那么请问 此时 "a" + new String("bc") 这个运算的详细过程是什么呢? 且s1 里面存储的又是什么呢?
第二个例子
String s1 = ”abc“ ;
String s2 = ""+"abc" 和 String s3 = "" + s1 有什么不同呢? 同样s3里面存储的是什么呢?

作者: 杨志    时间: 2012-5-3 21:22
这个问题!同求解释!
作者: 刘蕴学    时间: 2012-5-3 21:46
  1.                 String s0 = "a" + new String("bc");
  2.                 String s1 = "abc";
  3.                 String s2 = "" + "abc";
  4.                 String s3 = "" + s1;
复制代码
以上代码在运行期按照以下代码执行
  1.         String s0 = new StringBuilder("a").append(new String("bc")).toString();
  2.         String s1 = "abc";
  3.         String s2 = "abc";
  4.         String s3 = new StringBuilder().append(s1).toString();
复制代码

作者: 姚鑫    时间: 2012-5-3 23:08
public static void main(String[] args) {
                String str1 = "a";
                String str2 = "b";
                String str3 = "ab";
                String str4 = "a" + "b";//在编译时就直接在字符串池中找到"ab",str4指向字符串池
                String str5 = str1 + str2;//先在堆中创建两个String对象,分别为"a","b",再利用StringBuild的append(),创建"ab",把"ab"的堆地址赋给str5
                String str6 = str1 + "b";//还是在堆中分配
                System.out.println(str3 == str4);
                System.out.println(str3 == str5);
                System.out.println(str3 == str6);
        }
result:
true
false
false




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