java中String和Stringbuffer的区别是什么? 谢谢了我总分不多就给6分了这个问题原来一直认为自己很清楚后来遇到很多麻烦感觉还是没有弄明白 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 根本的区别就是String定义的对象申请的是固定内存StringBuffer对象是变长的,里面用char数组动态增加内存,所以可以用append方法动态改变字符串,且内存地址不变有时间看看源码就知道了 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都是整数,分别表示删除的子串在原字符串中的起始位置和结束位置(不包括结束位置的字符) 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); }}运行结果:ggge不是说String的内容不变的吗?为什么经过 s3=s4 以后,打印s3时候,内容变了呢? 查看JAVA文档对string说明如下Stringpublic 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” 简单点说,String是不可变的,StringBuffer是可变的。对String做任何操作它都会开辟新的内存空间,而StringBuffer是在原来地址上操作的String ss="abc";ss=ss+"aa";做加的运算时,开辟新内存空间,赋给运算结果,ss指向新的地址。而StringBuffer就是操作原地址。。 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 大家的理解很好我学习了谢谢明天晚上我就结贴另外回复5楼的你看的是那个文档我下载的是java platform SE 5.0文档中没有你所写出的图示那个是你的总结吧不错的 s3,s4都是引用变量,它们是可以变的,它们可以指向不同的String对象;不变的是它们所指向的String对象,这些对象创建之后就不能改变了。5楼的详细的讲解了s3和s4这两个引用变量的变化过程,很清晰。 技术面试过后,HR多久会有通知呀? 请大家看看这个程序 求APPLET+SERVLET之间通讯简单DOME [Eclipse]IDE如何提示RuntimeException? 菜鸟的问题 jbuilder中的一个小问题,急!!! 有C++基础,想学JAVA,不知如何入手,请高手指教! 请问,如果在Jbuilder中实现两个窗口的互相调用? 鼠标事件的问题 新手学Javascript应从那方面入手? 求较大侠指点迷津 问几个很容易混淆的问题
StringBuffer对象是变长的,里面用char数组动态增加内存,所以可以用append方法动态改变字符串,且内存地址不变
有时间看看源码就知道了
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都是整数,分别表示删除的子串在原字符串中的起始位置和结束位置(不包括结束位置的字符)
* @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时候,内容变了呢?
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”
String是不可变的,StringBuffer是可变的。对String做任何操作它都会开辟新的内存空间,
而StringBuffer是在原来地址上操作的String ss="abc";
ss=ss+"aa";
做加的运算时,开辟新内存空间,赋给运算结果,ss指向新的地址。
而StringBuffer就是操作原地址。。
我学习了
谢谢明天晚上我就结贴另外
回复5楼的你看的是那个文档我下载的是java platform SE 5.0文档中没有你所写出的图示那个是你的总结吧不错的
不变的是它们所指向的String对象,这些对象创建之后就不能改变了。
5楼的详细的讲解了s3和s4这两个引用变量的变化过程,很清晰。