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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔朋朋 中级黑马   /  2012-10-5 18:36  /  2000 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔朋朋 于 2012-10-5 21:41 编辑

对于字符串,java有String、StringBuilder、StringBuffer类。
对于三者的选择,当字符串修改不频繁时,可以用String;当你的字符串要频繁改变时,如网络中读写数据,建议用StringBuffer或StringBuilder,这两个类在修改字符串时,是在原来字符串内存的基础上修改的,这样的话节省内存。

这两个类都是用于字符串修改频繁的操作,但是分成StringBuilder和StringBuffer,他们应该还有各自不同的使用范围,这两个类又有什么区别呢?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
跑场的
                  
回复 使用道具 举报
StringBuilder不是线程安全的StringBuffer是线程安全的。
如果说某个字符被多个线程操作,那StringBuffer比较好,但是效率上肯定会没StringBuilder高,如果不用StringBuffer也可以自己用加锁来解决。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
常用StringBuilder,虽然线程不安全,但是速度快,效率高,如果多线程的话可以加同步。
而StringBuffer线程同步,就会因为考虑线程安全进行额外操作就比较慢了。
所以一般线程同步的都会慢慢被淘汰的,比如说verctor被ArrayList替代了。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 王得新 于 2012-10-5 19:46 编辑

功能啥的,楼上的都说的差不多了,在这里举个很典型的例子

public class StringBuilderTester {
   
     private static final int num=1000000;
    //string 类测试
     public static void stringTest() {
      long begin, end;
      begin = System.currentTimeMillis();
      String string = new String();
      for (int i = 0; i < num/100; i++) {
       string = string + " string ";
      }
      end = System.currentTimeMillis();
      System.out.println((end - begin)
        + "millis .............. String");
     }
     //StringBuffer类测试
     public static void stringBufferTest() {
      long begin, end;
      begin = System.currentTimeMillis();
      StringBuffer buffer = new StringBuffer();
      for (int i = 0; i < num; i++) {
       buffer = buffer .append(" buffer ");
      }
      end = System.currentTimeMillis();
      System.out.println((end - begin)
        + "millis ................ StringBuffer");
     }
     //Stringbuilder类测试
     public static void stringBuilderTest() {
      long begin, end;
      begin = System.currentTimeMillis();
      StringBuilder builder = new StringBuilder();
      for (int i = 0; i < num; i++) {
       builder = builder .append(" builder ");
      }
      end = System.currentTimeMillis();
      System.out.println((end - begin)
        + "millis ............... StringBuilder");
     }

     public static void main(String[] args) {
      stringTest();
      stringBufferTest();
      stringBuilderTest();
     
     }
    }


结果,一目了然了吧
498millis ......... String
104millis ......... StringBuffer
62millis .......... StringBuilder

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 王得新 于 2012-10-5 20:06 编辑

刚看了下源代码:

//StringBuffer
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
//下面是这个类中的部分方法,看了下,基本上每个方法上都有同步(synchronized,线程安全的) 关键字
public synchronized int length() {
    return count;
    }

    public synchronized int capacity() {
    return value.length;
    }


    public synchronized void ensureCapacity(int minimumCapacity) {
    if (minimumCapacity > value.length) {
        expandCapacity(minimumCapacity);
    }
    }

public synchronized StringBuffer append(Object obj) {
    super.append(String.valueOf(obj));
        return this;
    }
}

//StringBuilder类,
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
//下面是这个类中的部分方法,方法都没有synchronized 关键字
public StringBuilder append(Object obj) {
    return append(String.valueOf(obj));
    }

public StringBuilder delete(int start, int end) {
    super.delete(start, end);
        return this;
    }

    /**
     * @throws StringIndexOutOfBoundsException {@inheritDoc}
     */
    public StringBuilder deleteCharAt(int index) {
        super.deleteCharAt(index);
        return this;
    }

    /**
     * @throws StringIndexOutOfBoundsException {@inheritDoc}
     */
    public StringBuilder replace(int start, int end, String str) {
        super.replace(start, end, str);
        return this;
    }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多谢    很详细{:soso_e179:}
回复 使用道具 举报
解释的很详细,好!{:soso_e179:}
回复 使用道具 举报
很给力呀!赞一个{:soso_e179:}
回复 使用道具 举报
牛逼啊       果然全是黑马的料
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马