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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山西_李帅 中级黑马   /  2013-4-14 18:47  /  1970 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 山西_李帅 于 2013-4-14 22:50 编辑

StringBuffer是干嘛的,它的作用是什么,我们用它来干什么?哪个高手可以解答一下

11 个回复

倒序浏览
山西_李帅 来自手机 中级黑马 2013-4-14 18:51:51
沙发
是不是和String差不多,只不过他们俩的效率不同,而且String不可改变创建以后的值
回复 使用道具 举报
山西_李帅 来自手机 中级黑马 2013-4-14 18:54:41
藤椅
append方法就是连接的作用吗。
回复 使用道具 举报
本帖最后由 沈浩 于 2013-4-14 18:59 编辑

StringBuffer是一个类 是字符串缓冲  它的对象可以用来临时存储的  也就是一个容器
回复 使用道具 举报
String类不可更改,每次变化实际上都是指针移向了新的String对象。
对String作改动不能直接改那个String本身,而是要创建新的String,
如果改动次数多,使用String的话效率不高。
而StringBuffer本身可以改变,这是可以叫它字符串缓冲类吧。
   
    public void test() {
        long begin = System.currentTimeMillis();
        String s = "";
        for(int i=0; i<100000; i++){
            s+="q";//把String类的对象拼接一个q,拼接99999次
        }
//输出执行时间:单位毫秒
        System.out.println(System.currentTimeMillis()-begin);
  
        
        begin = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<100000; i++){
            sb.append("q");//把StringBuffer类的对象拼接一个q,拼接99999次
        }
//输出执行时间:单位毫秒
        System.out.println(System.currentTimeMillis()-begin);
    }
输出为
9360
15

做10万次拼接,String要9.36秒,而StringBuffer则需要0.015秒,效率很高。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
回答的有点多,但是我感觉我写完之后你应该能很容易理解

String和StringBuffer的区别,首先,StringBuffer要比String运行的速度快很多。

String str = new String("welcome to ");
str += "here";的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

我先说一下
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

在这里我再进行一点点的补充就是:StringBuilder
在JDK1.5版本之后出现了StringBuilder
不同之处:
StringBuffer是线程同步
StringBuilder是线程不同步的
(以后遇到程序的时候,遇到多线程的时候遇到StringBuffer)


再给你举个效率的例子。
将26个英文字母重复加了5000次,

  1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
  2.          int times = 5000;
  3.          long lstart1 = System.currentTimeMillis();
  4.          String str = "";
  5.          for (int i = 0; i < times; i++) {
  6.              str += tempstr;
  7.          }
  8.          long lend1 = System.currentTimeMillis();
  9.          long time = (lend1 - lstart1);
  10.          System.out.println(time);
复制代码
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码

  1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
  2.          int times = 5000;
  3.          long lstart2 = System.currentTimeMillis();
  4.          StringBuffer sb = new StringBuffer();
  5.          for (int i = 0; i < times; i++) {
  6.              sb.append(tempstr);
  7.          }
  8.          long lend2 = System.currentTimeMillis();
  9.          long time2 = (lend2 - lstart2);
  10.          System.out.println(time2);
复制代码
得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。




评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Alan 中级黑马 2013-4-14 19:08:54
7#
字符缓冲器,效率高,具备增、删、改、读等功能,而且效率高。 可以理解为字符数组 但功能更多,可以改变长度,具体建议查看API-StringBuffer
回复 使用道具 举报
StringBuffer  ---->字符串缓冲区
是一个字符串容器,其特点为:
1,长度是可以变化的。
2,可以直接操作多个数据类型。
3,最终会通过toString方法编程字符串。
常见功能:存储,删除,获取,修改,查找
String类一旦创建对象,这个对象就不能修改了。这是最大的区别。
回复 使用道具 举报
StringBuffer与String其实本质上对于功能来说区别不大。但是最大的区别,就是一个是容器,一个是不可改变的对象。

对于有时候你想直接在字符串后加一个字符来说,StringBuffer节省空间。
回复 使用道具 举报
山西_李帅 来自手机 中级黑马 2013-4-14 20:32:48
10#
陈中岩 发表于 2013-4-14 19:02
回答的有点多,但是我感觉我写完之后你应该能很容易理解

String和StringBuffer的区别,首先,StringBuffer ...

谢谢啊,明白,尤其是你说的那个append,我之前那里有点绕,现在明白了,其实也就是附值,他能接收的类型很多。明白了明白了,谢谢啊
回复 使用道具 举报
山西_李帅 发表于 2013-4-14 20:32
谢谢啊,明白,尤其是你说的那个append,我之前那里有点绕,现在明白了,其实也就是附值,他能接收的类型 ...

没事没事,大家都是互相学习嘛
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马