String str = new String("hello"); str+="Java";这两句代码共有几个对象?
展开全部
5个。
直接量"hello"存在池中。由这个串创建一个新对象(存在堆中),赋给str。这已经两个了。直接量"java"存在池中。三个。
从池中取出"java",再从堆中取出原来的str,即"hello",追加起来成为一个新串"hellojava"(存在池中),然后把这个新串赋值给变量str(存在堆中)。共5个。
freish太有才了。这个算他的。
需要说明的是:第一次出现字符串直接量时会在池中创建一个新的,之后出现就不会创建了,而是直接把引用指向第一次创建的对象。 但对于new出来的对象,无论怎样赋值,new一次创建一次(在堆中),不会考虑之前是否已经已存在相同的。而且,字符串是不可追加的,所以每次使用连接符号其实相当于先产生一个常量,然后再赋给引用,原来指向的串就成垃圾被回收了。
直接量"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个对象
这句话会在字符串常量池里有一个"hello"的对象。str是new出来的,在堆中也会有一个对象空间,指向hello的引用。
str+="Java";
Java也会在常量池产生一个对象。由于String是不可变长度的,那么同时会在字符串常量池产生helloJava这样一个对象,str引用指向它。
所以一共4个对象
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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”在堆和常量池各一个
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”在堆和常量池各一个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个,只有在str在实例化以后才在栈里划分内存空间
String str = new String("hello");
实例化对象
str+="Java"重新赋值而已
String str = new String("hello");
实例化对象
str+="Java"重新赋值而已
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我不一定对 我说3个
一个 hello 实体对象
一个 str引用对象
还一个 是helloJava 对象 赋值给 str 引用
一个 hello 实体对象
一个 str引用对象
还一个 是helloJava 对象 赋值给 str 引用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询