黑马程序员技术交流社区

标题: StringBuffer的问题 [打印本页]

作者: 山西_李帅    时间: 2013-4-14 18:47
标题: StringBuffer的问题
本帖最后由 山西_李帅 于 2013-4-14 22:50 编辑

StringBuffer是干嘛的,它的作用是什么,我们用它来干什么?哪个高手可以解答一下
作者: 山西_李帅    时间: 2013-4-14 18:51
是不是和String差不多,只不过他们俩的效率不同,而且String不可改变创建以后的值
作者: 山西_李帅    时间: 2013-4-14 18:54
append方法就是连接的作用吗。
作者: 沈浩    时间: 2013-4-14 18:55
本帖最后由 沈浩 于 2013-4-14 18:59 编辑

StringBuffer是一个类 是字符串缓冲  它的对象可以用来临时存储的  也就是一个容器
作者: 王洪宇    时间: 2013-4-14 18:56
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秒,效率很高。
作者: 陈中岩    时间: 2013-4-14 19:02
回答的有点多,但是我感觉我写完之后你应该能很容易理解

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次的时候,差异更大。不信你试试。





作者: Alan    时间: 2013-4-14 19:08
字符缓冲器,效率高,具备增、删、改、读等功能,而且效率高。 可以理解为字符数组 但功能更多,可以改变长度,具体建议查看API-StringBuffer
作者: 刘海东    时间: 2013-4-14 19:11
StringBuffer  ---->字符串缓冲区
是一个字符串容器,其特点为:
1,长度是可以变化的。
2,可以直接操作多个数据类型。
3,最终会通过toString方法编程字符串。
常见功能:存储,删除,获取,修改,查找
String类一旦创建对象,这个对象就不能修改了。这是最大的区别。

作者: 王大斌    时间: 2013-4-14 19:14
StringBuffer与String其实本质上对于功能来说区别不大。但是最大的区别,就是一个是容器,一个是不可改变的对象。

对于有时候你想直接在字符串后加一个字符来说,StringBuffer节省空间。
作者: 山西_李帅    时间: 2013-4-14 20:32
陈中岩 发表于 2013-4-14 19:02
回答的有点多,但是我感觉我写完之后你应该能很容易理解

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

谢谢啊,明白,尤其是你说的那个append,我之前那里有点绕,现在明白了,其实也就是附值,他能接收的类型很多。明白了明白了,谢谢啊
作者: 陈中岩    时间: 2013-4-14 22:38
山西_李帅 发表于 2013-4-14 20:32
谢谢啊,明白,尤其是你说的那个append,我之前那里有点绕,现在明白了,其实也就是附值,他能接收的类型 ...

没事没事,大家都是互相学习嘛
作者: 黄玉昆    时间: 2013-4-14 22:55
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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