String str = new String("hello"); str+="Java";这两句代码共有几个对象?

 我来答
左手西阳
2009-07-18 · TA获得超过5721个赞
知道大有可为答主
回答量:4835
采纳率:37%
帮助的人:2476万
展开全部
5个。
直接量"hello"存在池中。由这个串创建一个新对象(存在堆中),赋给str。这已经两个了。直接量"java"存在池中。三个。
从池中取出"java",再从堆中取出原来的str,即"hello",追加起来成为一个新串"hellojava"(存在池中),然后把这个新串赋值给变量str(存在堆中)。共5个。
freish太有才了。这个算他的。

需要说明的是:第一次出现字符串直接量时会在池中创建一个新的,之后出现就不会创建了,而是直接把引用指向第一次创建的对象。 但对于new出来的对象,无论怎样赋值,new一次创建一次(在堆中),不会考虑之前是否已经已存在相同的。而且,字符串是不可追加的,所以每次使用连接符号其实相当于先产生一个常量,然后再赋给引用,原来指向的串就成垃圾被回收了。
匿名用户
2009-07-18
展开全部
String str = new String("hello");
这句话会在字符串常量池里有一个"hello"的对象。str是new出来的,在堆中也会有一个对象空间,指向hello的引用。
str+="Java";
Java也会在常量池产生一个对象。由于String是不可变长度的,那么同时会在字符串常量池产生helloJava这样一个对象,str引用指向它。
所以一共4个对象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
freish
2009-07-18 · TA获得超过2878个赞
知道大有可为答主
回答量:3153
采纳率:0%
帮助的人:2683万
展开全部
public class StringTest {
public static void main(String... arguments) {
String str1 = "Java";
System.out.println(str1.intern() == str1);//true,表名str1是常量池的

String str2 = new String("hello");
System.out.println(str2.intern() == str2);//false,表名str2不是常量池的

String str3 = new String("hello") + "Java";
System.out.println(str3.intern() == str3);//false,表明str3不是常量池的,也说明编译的时候没有将“hello”和“Java”相连

String str4 = "hello" + "Java";
System.out.println(str4.intern() == str4);//true,表明str4是常量池的,也从侧面表明在编译的时候已经做了相加的操作了
}
}

综上

LZ的例子中会有5个对象,因为是new String("hello"),所以这个不是常量,而“Java”是常量
首先,“hello”在堆和常量池各一个
其次,“Java”在常量池有一个
最后,“helloJava”在堆和常量池各一个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
绮绮宝妈
2009-07-18 · TA获得超过343个赞
知道小有建树答主
回答量:415
采纳率:0%
帮助的人:241万
展开全部
一个,只有在str在实例化以后才在栈里划分内存空间
String str = new String("hello");
实例化对象
str+="Java"重新赋值而已
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超级大股民
2009-07-18 · TA获得超过108个赞
知道小有建树答主
回答量:1340
采纳率:0%
帮助的人:1045万
展开全部
我不一定对 我说3个

一个 hello 实体对象
一个 str引用对象
还一个 是helloJava 对象 赋值给 str 引用
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式