String str = new String (“hello”) ;
str += “world” ;
请教:创建了哪5个对象?其中String str = new String (“hello”) ;创建了2个对象,另外3个对象是怎么创建的?
另外对于StringBuffer st=new StringBuffer("abc");
如果执行了:st.append("def");是否会修改字符串池中的对象?
str += “world” ;
请教:创建了哪5个对象?其中String str = new String (“hello”) ;创建了2个对象,另外3个对象是怎么创建的?
另外对于StringBuffer st=new StringBuffer("abc");
如果执行了:st.append("def");是否会修改字符串池中的对象?
String str = new String (“hello”) ;
str += “world” ;
//这句相当于
Strign strTemp="world";
str+="world";
类似于这样
String str = new String (“hello”) ;
str += “world” ;
//这句相当于
Strign strTemp="world";
str+=strTemp;
而stringbuffer是创建了一个对象,append操作是在此对象上在追加字符串
第三个是“word”在池中建一个,第四个是“hello”与“word”合在一起的“helloword”又返回一个新的对象str,第五个是“helloword”在池中的创建的对象
StringBuffer中的append方法不会修改池中的对象,只是修改在堆中的st对象
关于st+=“world”其实就是str=str+"world",而这里因为str是个变量,所以java编译器不做优化处理,所以首先看到str已经在string pool中有其对象的引用,所以不创建,但是对于world,在string pool中没有,所以被intern到string pool中(一个对象),然后是str+“world”这个连接以后的对象在heap上创建了一个,并且在string pool也有一个,所以一共是3个,加上之前的两个就是5个了~~~,
对于str += “world” ;因为是String类,所以每次在后面加上字符串都是重新创建一个新的对象,同时也在data区创建字符常量world
我想应该是这五个吧,个人见解,请指教
答:
1) 4个.
String str = new String (“hello”) ; 这一句不用说了,是2个.str += “world” ; 这一句呢? 2个.
哪2个?第一个当然是:"word"了.另一个呢?
str += “world” 这一句,JAVA编译程序是按:
str=new StringBuilder(str).append("word").toString();
进行生成代码的.
因此:第4个对象是由toString()中new String(...)产生的.结论:4个2)不会.
String str = new String (“hello”) ;
str += “world” ;
hello与world在字符串池中创建两个对象
然后new在heap中创建一个对象
然后str += “world” ; 在创建一个对象
同意楼上的4个对象。
2)不会.
hello 是一个
String (“hello”) ; 又是一个new String (“hello”)又是一个
String str又是一个
str += “world”又是一个
2)不会
对于相同内容的字符串对象在池中并不会创建另一对象。
"world"
new java.lang.String
new java.lang.StringBuilder
2)不会修改字符串池中的对象,字符串池对象没变。
分别是"abc"和"def";