黑马程序员技术交流社区

标题: 关于StringBuffer的赋值疑问 [打印本页]

作者: 邹学良    时间: 2013-3-9 20:38
标题: 关于StringBuffer的赋值疑问
  1. public class B {

  2. public static void main(String[] args) {
  3. StringBuffer sb = new StringBuffer("abc");
  4. String s = new String(sb);
  5. sb.append("123");
  6. System.out.println("StringBuffer: " + sb);
  7. System.out.println("String: " + s);

  8. }
  9. }
复制代码
为什么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, 下载次数: 115)

String与StringBuffer.png

作者: 黑马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