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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李鑫 初级黑马   /  2012-5-30 21:02  /  1791 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容是“hello”,还是“hello world!”,如果是后者,是不是前者已经存在于内存中了,这样不就造成很大的内存开销吗?那怎样才能解决这个问题?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 张亮 于 2012-5-30 21:13 编辑

是后者
用StringBuffer或者StringBuffer这两个类解决,他们的字符串是可变的

String 和StringBuffer,StringBuilder的区别
String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法
StringBuffer 与StringBuilder
从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与StringBuffer相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
最后s 里面是Hello world  ,这里要注意的是,String最大的特点是一旦初始化就不可以被改变

并不是s的值改变了,而是又在内存中开辟地址,指向这个对象"world".
楼主如果要对字符串做操作的话,就可以用到StringBuffer和StringBuilder
它们是一个容器,而且长度是可以变化的。可以直接操作多个数据类型。最终都会通过toString方法变成字符串

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 wyl530274554 于 2012-5-30 22:52 编辑

更正:
最初的"Hello",由于s重新指向,所以在内存中消失。

String类示例图:


用StringBuffer类的append方法即可增加字符串;
  1. public class TestStringBuffer {
  2.                 public static void main(String[] args){
  3.                                 StringBuffer s1 = new StringBuffer("Hello");
  4.                                 StringBuffer s2 = s1.append(" world!");
  5.                                 System.out.println(s2);
  6.                 }         
  7. }
复制代码

String.png (63.87 KB, 下载次数: 32)

String.png

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
是后者,String对象从创建开始就不会改变,一定会另开辟空间,一般使用StringBuilder来代替.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马