黑马程序员技术交流社区

标题: 对String str=”a”+”b”+”c”+”d”;会创建几个对象的总结 [打印本页]

作者: 小丑的媳妇2    时间: 2013-3-9 00:14
标题: 对String str=”a”+”b”+”c”+”d”;会创建几个对象的总结
String str=”a”+”b”+”c”+”d”;这句话会创建几个对象?
最近在论坛里不只是一次看到过有人问这个问题,我自己参考了很多资料,其实很多书上对这个问题的解法也不尽相同,我今天总结了一下我自己的想法,不对之处,请指正!

String str=”a”+”b”+”c”+”d”;
用SUN的jdk处理,经过javac编译之后,常量运算已经直接处理掉了,所以生成的class文件里的常量池表中有”abcd”这个串.所以执行这句话的时候,只会有一个对象.对于连编译和运行都分不清的人就不用多解释了.
这个问题有人用组合的方法得出很多结论,后来看到有人说,Thinking in Java上介绍的,内部原理是用的StringBuilder来连接的,这里有2个问题,
第一,如果这个例子会用StringBuilder来连接的话,那么String对象还是只有1个,
第二,如果问一共有几个对象,再考虑StringBuilder来连接的问题的话,那这里面起码又带来了StringBuilder类对应的Class对象及其内部对象,这个数量就很大了.
一个值得思考的问题是,既然能看到Thinking In Java中的结论,为什么不能看看TIJ中分析问题的思路呢.

顺便写点测试代码:
public class Main
{
public static void main(String arg[])
{
String str=”a”+”b”+”c”+”d”;
}
}

按照TIJ上的方法,也是我喜欢的方法:
javap -c Main
Compiled from “Main.java” public class Main extends java.lang.Object{
public Main(); Code:
0: aload_0 1: invokespecial #1; //Method java/lang/Object.”<init>”:()V
4: return
public static void main(java.lang.String[]); Code:
0: ldc #2; //String abcd 2: astore_1
3: return
}
可以看到,里面只有一个String abcd.
“a”+”b”+”c”+”d”都是常量的缘故,编译的时候就直接处理掉了,所以不会在运行的时候再通过StringBuilder来连接了.

改变代码,换个例子:
public class Main
{
public static void main(String arg[])
{
String s=”c”; String str=”a”+”b”+s+”d”;
}
}


大家看一下这个会出现几个String?

javap -c Main
Compiled from “Main.java” public class Main extends java.lang.Object{
public Main(); Code:
0: aload_0 1: invokespecial #1; //Method java/lang/Object.”<init>”:()V
4: return
public static void main(java.lang.String[]); Code:
0: ldc #2; //String c 2: astore_1
3: new #3; //class java/lang/StringBuilder 6: dup
7: invokespecial #4; //Method java/lang/StringBuilder.”<init>”:()V 10: ldc #5; //String ab
12: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: aload_1
16: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 19: ldc #7; //String d
21: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 24: invokevirtual #8; //Methodjava/lang/StringBuilder.toString:()Ljava/lang/String;
27: astore_2 28: return
}


可以发现这个例子中的String 有,”c”,”ab”(编译时对可确定的常量进行处理了),”d”,以及最后通过StringBuilder.toString生成的String “abcd”.


这道题给我最大的感触是,看书的意义是什么?起码不是背结论!

作者: 夏振博    时间: 2013-3-9 00:45
挺好,想知道下面那些是怎么弄出来的{:soso_e100:}
作者: 黄玉昆    时间: 2013-3-9 08:45
不用疑问,就是一个对象,你可以看看这个帖子http://bbs.itheima.com/thread-38472-1-1.html
还有这个整理的帖子:http://bbs.itheima.com/thread-39609-1-1.html




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