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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴在兴 中级黑马   /  2013-1-25 20:23  /  1849 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

StringBuffer与StringBuilder有什么区别? 请具体举个例子把 {:soso_e100:}

4 个回复

倒序浏览
StringBuffer字符串缓冲区多线程同步
特有方法:
StringBuffer append(int x);
StringBuffer  delete(int start, int end );
StringBuffer  insert(int index,String str);
StringBuffer  reverse();

StringBuilder多线程不同步,但是效率快JDK1.5后出现
回复 使用道具 举报
StringBuffer是线程安全的。StringBuffer的方法都是同步的
StringBuilder是线程不安全的。StringBuilder的方法是不同步的。
回复 使用道具 举报
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
回复 使用道具 举报
本帖最后由 廖成 于 2013-1-26 11:32 编辑

StringBuffer 线程安全
StringBuilder 线程不安全

为了达到线程安全的目的在一定程度上会降低程序的性能。所以在单线程中,StringBuilder的性能要比StringBuffer高。多线程为了线程安全需要采用StingBuffer。其实在线程不考虑的情况下,要是程序对性能的要求不高,太在意这两者的区别就没有什么意义。         
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String.当需要在循环中多次使用字符串拼接时,建议使用StringBuilder或StringBuffer.当数量级在百万级(这里可能不准确)时,StringBuilder的速度会体现出来.
实验代码:
  1. final static int ttime = 30000;// 测试循环次数

  2.         public void test(String s) {
  3.                 long begin = System.currentTimeMillis();
  4.                 for (int i = 0; i < ttime; i++) {
  5.                         s += "add";
  6.                 }
  7.                 long over = System.currentTimeMillis();
  8.                 System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 ");
  9.         }

  10.         public void test(StringBuffer s) {
  11.                 long begin = System.currentTimeMillis();
  12.                 for (int i = 0; i < ttime; i++) {
  13.                         s.append("add");
  14.                 }
  15.                 long over = System.currentTimeMillis();
  16.                 System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 ");
  17.         }

  18.         public void test(StringBuilder s) {
  19.                 long begin = System.currentTimeMillis();
  20.                 for (int i = 0; i < ttime; i++) {
  21.                         s.append("add");
  22.                 }
  23.                 long over = System.currentTimeMillis();
  24.                 System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 ");
  25.         }

  26.         // 对 String 直接进行字符串拼接的测试
  27.         public void test2() {
  28.                 String s2 = "abadf";
  29.                 long begin = System.currentTimeMillis();
  30.                 for (int i = 0; i < ttime; i++) {
  31.                         String s = s2 + s2 + s2;
  32.                 }
  33.                 long over = System.currentTimeMillis();
  34.                 System.out.println(" 操作字符串对象引用相加类型使用的时间为: " + (over - begin) + " 毫秒 ");
  35.         }

  36.         public void test3() {
  37.                 long begin = System.currentTimeMillis();
  38.                 for (int i = 0; i < ttime; i++) {
  39.                         String s = "abadf" + "abadf" + "abadf";
  40.                 }
  41.                 long over = System.currentTimeMillis();
  42.                 System.out.println(" 操作字符串相加使用的时间为: " + (over - begin) + " 毫秒 ");
  43.         }

  44.         public static void main(String[] args) {
  45.                 String s1 = "abc";
  46.                 StringBuffer sb1 = new StringBuffer("abc");
  47.                 StringBuilder sb2 = new StringBuilder("abc");
  48.                 Test t = new Test();
  49.                 t.test(s1);
  50.                 t.test(sb1);
  51.                 t.test(sb2);
  52.                 t.test2();
  53.                 t.test3();
  54.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马