java中String和Stringbuffer的区别是什么?

andevele 2007-11-28 04:53:12
谢谢了
我总分不多
就给6分了

这个问题原来一直认为自己很清楚

后来遇到很多麻烦

感觉还是没有弄明白

...全文
2910 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
action_520_12 2007-11-29
  • 打赏
  • 举报
回复
s3,s4都是引用变量,它们是可以变的,它们可以指向不同的String对象;
不变的是它们所指向的String对象,这些对象创建之后就不能改变了。
5楼的详细的讲解了s3和s4这两个引用变量的变化过程,很清晰。
andevele 2007-11-28
  • 打赏
  • 举报
回复
大家的理解很好
我学习了
谢谢

明天晚上我就结贴

另外
回复5楼的

你看的是那个文档

我下载的是java platform SE 5.0

文档中没有你所写出的图示

那个是你的总结吧

不错的
langmanpaomo 2007-11-28
  • 打赏
  • 举报
回复
又跟着复习了一遍,谢谢啦
suihu 2007-11-28
  • 打赏
  • 举报
回复
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,

即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这

个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就

可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据

iori890218 2007-11-28
  • 打赏
  • 举报
回复
简单点说,
String是不可变的,StringBuffer是可变的。

对String做任何操作它都会开辟新的内存空间,
而StringBuffer是在原来地址上操作的

String ss="abc";
ss=ss+"aa";
做加的运算时,开辟新内存空间,赋给运算结果,ss指向新的地址。
而StringBuffer就是操作原地址。。
W51075007 2007-11-28
  • 打赏
  • 举报
回复
查看JAVA文档对string说明如下

String
public String(String original)初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本。

参数:
original - 一个 String。

由说明可知:在编译执行String s3 = new String("f"); 的时候,在内存中创建了两个对象

回答楼上:
  字符串常量有一个string pool,即常量池!程序执行String s3 = new String("f"); 的时候,编译器先在String pool中检查是否有内容为“f”的字符串,如果sting pool中已经存在字符串“f”则程序通过new String("f")在堆中创建一个字符串“f”,如果sting pool中没有“f”,则执行这句的时候在String pool和堆中分别创建
一个对象,对象的内容为字符串都是字符串“f”,s为指向堆中“f”的引用
   
String s4 = new String("g"); 的执行同上。s4 是指向堆中字符串“g”的引用

执行完前两句后,的情况如图所示:

第三句:s3 = s4; //s3和s4将指向同一个引用,即s4指向的对象"g" 所以输出的s3 和s4都是"g"
此时:

s4 = new String("e"); //此句创建了两个对象,s4此时已经不再指向堆中的"g",而是指向先创建的对象"e" ,s3的引用不变,仍然指向“g”


   
andevele 2007-11-28
  • 打赏
  • 举报
回复


public class E_StringBuffer {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub



String s3 = new String("f");
String s4 = new String("g");

s3=s4;
System.out.println(s3);
System.out.println(s4);

s4 = new String("e");
System.out.println(s3);
System.out.println(s4);


}

}

运行结果:
g
g
g
e

不是说String的内容不变的吗?为什么经过 s3=s4 以后,打印s3时候,内容变了呢?
seaforce 2007-11-28
  • 打赏
  • 举报
回复
楼上正解
W51075007 2007-11-28
  • 打赏
  • 举报
回复
  String类型的字符串里面的内容不能修改,如需要修改,编译器会新创建一个字符串对象,有时在编程中并不希望这样,希望能改变字符串对象里的内容,就需要用StringBuffer类,即字符串缓冲区类。
  StringBuffer对象与String对象最大的不同在于StringBuffer不仅能修改字会串的长度,还能修改里面的内容,此外,在多线程编程中,StringBuffer对象较为安全

  StringBuffer类提供了很多对字符串的修改操作,如append() 追加操作.

append(value);
//参数value可以是任意基本数据类型以及Object的实例,表示插入的内容。


  StringBuffer sb = new StringBuffer(); //sb内容为空
sb.append(true); //追加布尔数据
sb.append(1.23); //追加双精度数据
  sb.append('A'); //追加字符串数据
sb.append("append"); //追加字符串

//最后得到的sb的内容为"true1.23Aend"
  


insert(int offset, value); //插入操作

  replace(int start, int end, String str); //替换操作,start 和 end都是整数,分别表示子串在原字符串的起始位置和结束位置(不包括字符串的结束位置)。str是一个字符串对象,表示用于替换的内容。

  delete(int start ,int end); //删除操作 start 和 end都是整数,分别表示删除的子串在原字符串中的起始位置和结束位置(不包括结束位置的字符)

  
for_cyan 2007-11-28
  • 打赏
  • 举报
回复
根本的区别就是String定义的对象申请的是固定内存
StringBuffer对象是变长的,里面用char数组动态增加内存,所以可以用append方法动态改变字符串,且内存地址不变
有时间看看源码就知道了

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧