A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邹学良 中级黑马   /  2013-3-9 20:38  /  4064 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  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共用同这个数据数组的么?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
上面的代码是按顺序执行的,String s=new String(sb)时,sb里面还没有“123”,只是将"abc"封装成了String对象,要想得到s="abc123",需要将sb.append("123");方法提到String s=new String(sb);前面

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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




评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
只要是new运算符会新创建一个对象,在堆内存中会多一个对象

String与StringBuffer.png (30.96 KB, 下载次数: 118)

String与StringBuffer.png

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
代码是顺序往下执行的,当执行到StringBuffer sb = new StringBuffer("abc");String s = new String(sb);时,sb中还没有添加"123",所以赋给s里面也就没有,当执行到sb.append("123");时就是给sb中添加"123",但并没有再次向s中赋值,所以s中还是原来的值,所以s的打印值不是abc123。
回复 使用道具 举报
String s = new String(sb);   这句的时候 已经在堆内存中开辟了一个空间  放了“abc”  s指向这个空间
这对StringBuffer没有任何影响  他们指的已经不是同一个空间了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马