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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张周飞 金牌黑马   /  2014-6-10 09:14  /  2050 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张周飞 于 2014-6-13 10:39 编辑

{:3_52:}学习遇到问题,求大神们解答一下:String 和StringBuffer的区别?

11 个回复

倒序浏览
String的长度是不可变的,StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法

评分

参与人数 1黑马币 +2 收起 理由
张周飞 + 2

查看全部评分

回复 使用道具 举报
String一旦定义后其值就不能改变,而StringBuffer相当于一个装字符串的可变容器,可以对装的内容进行增删改查等操作

评分

参与人数 1黑马币 +2 收起 理由
张周飞 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 杨韬略 于 2014-6-10 09:37 编辑

解答:string类型变量一经创建就不能改变其内容了,而StringBuffer是可以随便更改内容的,详情如下面这个测试小程序,帮你区分一下。


public class StringBufferTest {

        /**
         * @param args
         */
        StringBuffer buffer;
        public static void main(String[] args) {
               
               String s = "abc";
               s.substring(1);
               s.replace("bc", "xyz");
               System.out.println(s); //输出结果为abc,因为字符串一经创建是不能更改的,若要修改可以使用StringBuffer

                buffer=new StringBuffer("abc");   
                buffer.append(s);
                System.out.println(buffer.substring(0));
        }

}

评分

参与人数 1黑马币 +1 收起 理由
张周飞 + 1

查看全部评分

回复 使用道具 举报
其实就是“可变”和“不可变”的区别,String类型定义了一个字符串以后,其值是不可改变的,而StringBuffer可以通过append方法进行字符串追加。其次在字符串连接操作过程中,StringBuffer要比String运行效率要高

评分

参与人数 1黑马币 +1 收起 理由
张周飞 + 1

查看全部评分

回复 使用道具 举报 2 0

<html/>

本帖最后由 丁绍然 于 2015-9-27 09:48 编辑

<html/>                     <a href=“drop table user ”>

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
李小然 + 1
张周飞 + 1

查看全部评分

回复 使用道具 举报
大鑫 初级黑马 2014-6-10 18:41:36
7#
“String”对象是不可变对象,一旦创建就不能改变它的值,如果要修改“String”对象,是会重新创建一个新的对象,把修改的数据存入新的对象中,例如原有对象 String str = “ab”,如果str = str+“c”,会产生新的实例str,并把数据存入其中“abc”。而“StringBuffer”对象是一个可变对象,在StringBuffer”类中提供了众多可以操作StringBuffer”对象的方法,可以通过append()等方法改变对象的数据,并不会创建新的对象。
回复 使用道具 举报
String不可变,如果要把多个字符串连接起来,要转成StringBuffer,效率低,然后StringBuffer是可变的,可以直接连接多个字符串
回复 使用道具 举报
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
回复 使用道具 举报
String底层源代码 private final char value[]; 是一个不可以变的char类型字符数组 ,初始化后是一个不变的对象
StringBuffer,底层可变字符数组。使用append()f方法,返回值是StringBuffer,将任意类型数据,追加到缓冲区数组扩容,复制数组,并删除原数组。空参数的StringBuffer() ,自动创建一个16位的数组
频繁操作字符串,建立采用StringBuffer缓冲区对象,日后开发推荐使用StringBuilder,执行效率快
  StringBuilder也是一个字符串缓冲区
  StringBuilder和StringBuffer在方法上,和使用上一模一样,没有区别

区别在哪里:
StringBuffer 版本开始JDK1.0。StringBuffer是一个线程安全的对象
StringBuilder 版本开始JDK1.5。StringBuilder是一个线程不安全对象


   
   
回复 使用道具 举报
从连接字符串的角度讲:
StringBuffer的append方法比“+”高效。
字符串连接操作中StringBuffer的效率要比String高:
每次使用String的 "+",都是new了一个新的String 对象,
而StringBuffer 的append()方法,都是在原有的对象上进行的操作,
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.
因此,当需要对字符串进行多次修改时,最好用StringBuffer。
回复 使用道具 举报
上面区别已经说得很清楚了,我说说两者的转换
从String到StringBuffer:  StringBuffer sb = New StringBuffer("abcd");
从StringBuffer到String:  String str = sb.toString();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马