黑马程序员技术交流社区

标题: 求教,两者为什么不同 [打印本页]

作者: 李鑫    时间: 2012-5-30 21:02
标题: 求教,两者为什么不同
String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容是“hello”,还是“hello world!”,如果是后者,是不是前者已经存在于内存中了,这样不就造成很大的内存开销吗?那怎样才能解决这个问题?
作者: 张亮    时间: 2012-5-30 21:11
本帖最后由 张亮 于 2012-5-30 21:13 编辑

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

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

作者: 杨天皓    时间: 2012-5-30 21:31
最后s 里面是Hello world  ,这里要注意的是,String最大的特点是一旦初始化就不可以被改变

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


作者: 黑马-王言龙    时间: 2012-5-30 21:34
本帖最后由 wyl530274554 于 2012-5-30 22:52 编辑

[attach]3072[/attach]更正:
最初的"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, 下载次数: 37)

String.png

作者: 程序猿    时间: 2012-5-30 22:32
是后者,String对象从创建开始就不会改变,一定会另开辟空间,一般使用StringBuilder来代替.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2