String str = new String("hello"); str+="Java";这两句代码共有几个对象?
答案:6 悬赏:40 手机版
解决时间 2021-04-28 22:24
- 提问者网友:伴风望海
- 2021-04-28 14:03
String str = new String("hello"); str+="Java";这两句代码共有几个对象?
最佳答案
- 五星知识达人网友:低音帝王
- 2021-04-28 15:06
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一次创建一次(在堆中),不会考虑之前是否已经已存在相同的。而且,字符串是不可追加的,所以每次使用连接符号其实相当于先产生一个常量,然后再赋给引用,原来指向的串就成垃圾被回收了。
全部回答
- 1楼网友:逃夭
- 2021-04-28 19:34
我被弄迷糊了
- 2楼网友:痴妹与他
- 2021-04-28 18:15
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个对象
- 3楼网友:愁杀梦里人
- 2021-04-28 17:47
一个,只有在str在实例化以后才在栈里划分内存空间
String str = new String("hello");
实例化对象
str+="Java"重新赋值而已
String str = new String("hello");
实例化对象
str+="Java"重新赋值而已
- 4楼网友:你哪知我潦倒为你
- 2021-04-28 16:45
我不一定对 我说3个
一个 hello 实体对象
一个 str引用对象
还一个 是helloJava 对象 赋值给 str 引用
一个 hello 实体对象
一个 str引用对象
还一个 是helloJava 对象 赋值给 str 引用
- 5楼网友:神的生死簿
- 2021-04-28 16:18
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”在堆和常量池各一个
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯