黑马程序员技术交流社区
标题:
关于StringBuffer的赋值疑问
[打印本页]
作者:
邹学良
时间:
2013-3-9 20:38
标题:
关于StringBuffer的赋值疑问
public class B {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc");
String s = new String(sb);
sb.append("123");
System.out.println("StringBuffer: " + sb);
System.out.println("String: " + s);
}
}
复制代码
为什么S的打印值不是abc123?
不是String和StringBuffer共用同这个数据数组的么?
作者:
熊冠银
时间:
2013-3-9 20:49
上面的代码是按顺序执行的,String s=new String(sb)时,sb里面还没有“123”,只是将"abc"封装成了String对象,要想得到s="abc123",需要将sb.append("123");方法提到String s=new String(sb);前面
作者:
王亚东
时间:
2013-3-9 20:54
String是不可变字符串,而StringBuffer是可变的
StringBuffer sb = new StringBuffer("abc");这句话:常量池中有“abc”,堆内存中存在一个字符串缓冲区,初始值就是“abc”,初始大小是“abc”的长度加16
String s = new String(sb);这句话:把sb中的值给了s,也就是常量池中的“abc”,那么后面对sb操作对s没影响。
另:api中:java.lang.String
public String(StringBuffer buffer)分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。该字符串缓冲区的内容已被复制,后续对它的修改不会影响新创建的字符串。
参数:
buffer - 一个 StringBuffer
作者:
杨剑
时间:
2013-3-9 20:56
只要是new运算符会新创建一个对象,在堆内存中会多一个对象
String与StringBuffer.png
(30.96 KB, 下载次数: 148)
下载附件
2013-3-9 20:56 上传
作者:
黑马17期-闫东东
时间:
2013-3-9 21:34
本帖最后由 黑马17期-闫东东 于 2013-3-9 21:35 编辑
StringBuffer sb = new StringBuffer("abc");
StringBuffer 相当于是容器,
String s = new String(sb);//把StringBuffer的元素转成字符串形式表示,
sb.append("123");//向StringBuffer添加"123";
打印:
StringBuffer: abc123
String: abc
可以先添加 sb.append("123");
后装成String
String s = new String(sb); s就打印abc123
作者:
刘松老师
时间:
2013-3-9 21:56
代码是顺序往下执行的,当执行到StringBuffer sb = new StringBuffer("abc");String s = new String(sb);时,sb中还没有添加"123",所以赋给s里面也就没有,当执行到sb.append("123");时就是给sb中添加"123",但并没有再次向s中赋值,所以s中还是原来的值,所以s的打印值不是abc123。
作者:
amen0205
时间:
2013-3-10 06:06
String s = new String(sb); 这句的时候 已经在堆内存中开辟了一个空间 放了“abc” s指向这个空间
这对StringBuffer没有任何影响 他们指的已经不是同一个空间了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2