String b = "hate"; String a = b + "love"; 总共创建3个对象,分别是常量池中的“hate”和“love”,以及堆中的“hatelove”执行过程分析: 1.类加载时,常量池中创建了2个字符串字面常量"hate"和"love" 2.栈中创建引用b,指向常量池中的"hate" 3.栈中创建引用a,+运算后,堆中创建String对象"hatelove",引用a指向该对象
如果反汇编以上程序的字节码,可以发现,第二句话String a = b + "love"; 的实际实现是: String a = new StringBuilder().append(b).append("love").toString(); 所以其实最后是通过toString()方法返回的对象 再查看API中toString()方法的源代码 可以得出结论,返回的是一个堆中的新的对象
3个:引用b,引用a ,一个"hatelove" 说明,应用对象肯定是新创建的。而"hate"因为是常量,所以这里没有创建String对象而是直接从常量池拿。String a = b + "love";("love"是从常量池里取的)是变量,不能在常量池里取,所以只能new一个! 正确否?
门牌号当然不是房子了~`` LZ问的是生成了几个对象,而不是生成了几个String对象 按照ZangXT的分析 String b = "hate"; String a = b + "love"; 应该是生成了一个String对象,一个StringBuilder对象吧? LZ的题目里没有生成对象?
http://blog.csdn.net/luojihaidao/archive/2009/02/05/3863658.aspx
String c = "xx" + a;
这里到底有几个对象生成??
正因为大家有歧义才拿出来讨论
String a = "temp";
有人说生成两个对象。
先在heap里创建一个,
再在contant pool 创建一个,指向heap中的那一个。
这样就创建了两个对象。
String a = "temp";
只是生成了一个对象temp,而且直接放在常量池里的String a = new String("temp");
就像你说的,生成2个对象,一个String对象,一个temp
String b = "hate";
String a = b + "love";
这里总共会生成几个对象????????
String str2 = "abc";if(str1 == str2)
System.out.println("Only one object");
else
System.out.println("Not only one object");
如果只是单纯的字符串相加,就只是在常量池里生成一个对象
String str1 = "abc";
String str2 = "a" + "bc"; //和str1是相同的对象
String str3 = str2 + ""; //和str1是不同的对象
String b = "hate";
String a = b + "love";
这里总共会创建几个对象?
三个,StringBuilder一个。另外有两个String
因为String使用private final char value[]来实现字符串的存储,所以用+后,会产生新的对象
关于String,我想了解我列的内容应该够全了。
String a = b + "love";
总共创建3个对象,分别是常量池中的“hate”和“love”,以及堆中的“hatelove”执行过程分析:
1.类加载时,常量池中创建了2个字符串字面常量"hate"和"love"
2.栈中创建引用b,指向常量池中的"hate"
3.栈中创建引用a,+运算后,堆中创建String对象"hatelove",引用a指向该对象
有什么证据表明这里是在堆里创建的,我还是以为在常量池里创建的。
String a = new StringBuilder().append(b).append("love").toString();
所以其实最后是通过toString()方法返回的对象
再查看API中toString()方法的源代码
可以得出结论,返回的是一个堆中的新的对象
说明,应用对象肯定是新创建的。而"hate"因为是常量,所以这里没有创建String对象而是直接从常量池拿。String a = b + "love";("love"是从常量池里取的)是变量,不能在常量池里取,所以只能new一个!
正确否?
LZ问的是生成了几个对象,而不是生成了几个String对象
按照ZangXT的分析
String b = "hate";
String a = b + "love";
应该是生成了一个String对象,一个StringBuilder对象吧?
LZ的题目里没有生成对象?
反射便知
1.字面常量,就是引号包围的字符串,比如“abc”等。
2.自己对字符串对象调用intern操作。
如何证明呢?
http://blog.csdn.net/ZangXT/archive/2009/09/20/4571644.aspx