String s = "a" + "b" + "c" + "d" + "e";
问此语句共创建了几个对象,据说是10个,请专家点评
问此语句共创建了几个对象,据说是10个,请专家点评
解决方案 »
- 关于java插入mysql数据库的问题
- 请教一个问题(about JTable and JComboBox)
- 本人第一次接触JBOSS,希望大家给我提提意见哈,不甚感谢哈!!
- java的移植问题。欢迎讨论:)
- 小弟初到JAVA,发贴散分,并提一问
- ABC 经常看到Java TM 字样﹐请问下TM表示什幺意思?
- 急,是不是带包的编译问题?
- 学校要做一个关于学生就业的网站,我以前用过asp现在 想用linux+mysql+apache做平台,大家给个注意...
- 请问JAVA怎么得到一个字符的ASC值。
- 有关JBuilder的,很急。
- JAVA基础知识测试题
- CSDN上的高手哪去了?怎么提问过没人解答啊?
常量池中a,b,c,d,e,ab,abc,abcd,abcde,外加堆空间中s对象的引用
a,b,c,d,e,ab,abc,abcd,abcde
编译器编译的时候就处理为"abcde"了 。
IBM也这么无聊。
String s = "a" + "b" + "c" + "d" + "e";
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接讲它们连接的结果提取出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个
以前看书 知道了
String s="a"+"b"+"c"
等价于String s="abc"真的快忘记了
幸好今天看到 否则说不定哪天笔试就栽在这种无聊的题目上
首先由String a+String b产生对象StringBuffer ab;让后在将StringBuffer ab转化成String ab对象.换而言之。第一次+操作生成2个对象。同时对象String a,String b为NULL;后面过程与前面一致
。一共8个对象。4个可变StringBuffer ab,abc,abcd,abcde;4个不可变长度String ab,abc,abcd,abcde;
一共8个对象。当然其中+作为一种符号,a,b,c,d,e在做+法的时候做为参数传递到堆栈。这个应该不算是特地产生的。是本
总共加起来10个
都说了一个了哪又来了10个了,编译时就拼成了 abcde
哈哈,我日你们到底说是几个咯??一会10个,一会1个,一会8个的老子明天去sun公司问前台,你们哪个跟我一起去咯??我在人民大学西门这边,出来集合
不然它肯定会去做 "a"+"b"+"c"+"d"+"e";
javac只是吧我们写的源代码变成字节文件 并且检查语法。
java的编译环境叫JVM。
java的编译器叫 JIT 即时编译器。
用一点编译一点。还记得吗?
如果懂反汇编的话用javap命令查常量池信息,如果不懂的话你用jad把class文件反编译一下看看也能得出结论。
所以String s = "a" + "b" + "c" + "d" + "e"; 编译器会进行优化直接把他们表示成"abcde"存储到String Pool中详情请看这个帖子,你就能明白:
http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html
String s = "abcd";
String s1="a"+"b"+"c"+"d";
System.out.println(s==s1);
打印出来是true··就说明只创建了一个对象·
以前理解的是
String s = "a" + "b" + "c" + "d" + "e";
就等于
String s="abcde";
现在彻底晕了!~~
如果按照jvm的运行原理来说的话
1楼的是对的吧
public static void main(String[] args){
String s = "a" + "b" + "c" + "d" + "e";
System.out.println(s);
}
}反编译一下
Compiled from "a.java"
public class a extends java.lang.Object{
public a();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: returnpublic static void main(java.lang.String[]);
Code:
0: ldc #2; //String abcde 直接是abcde
2: astore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return}
我查了下书:java编程思想
String 的内部结构是通过StringBuilder实现的! 所以没有生成ab abc 等对象
s引用在堆栈里,肯定不是对象
所以只创建了一个对象abcde
看看这个帖子吧
就 没必要在讨论了
String 不是直接存储字面值的吧。。我看书说都是引用来的。。
不大同意一楼和十三楼的回答,我想这样:
好的,先计算=右边的表达式,注意"a","b","c","d","e";不是'a','b','c','d','e';那么每个都是String类型的一个对象,所以先在堆中建立"a","b","c","d","e"五个对象;然后,"ab","abc","abcd","abcde",再建立四个对象;一共九个对象在堆中;而String s是一个引用,建立在栈中,不是对象;只是s这个引用最终指向"abcde";所以一共九个对象,一个引用;这也是为什么,大量"+"运算的时候建议使用StringBuffer对象了;因为在这种"+"运算的过程中产生了大量的对象,为GC带来一定的开销....大概是这样的吧
or more
不大同意一楼和十三楼的回答,我想这样:
好的,先计算=右边的表达式,注意"a","b","c","d","e";不是'a','b','c','d','e';那么每个都是String类型的一个对象,所以先在堆中建立"a","b","c","d","e"五个对象;然后,"ab","abc","abcd","abcde",再建立四个对象;一共九个对象在堆中;而String s是一个引用,建立在栈中,不是对象;只是s这个引用最终指向"abcde";所以一共九个对象,一个引用;这也是为什么,大量"+"运算的时候建议使用StringBuffer对象了;因为在这种"+"运算的过程中产生了大量的对象,为GC带来一定的开销....大概是这样的吧