Java中StringBuffer和StringBuilder_动力节点Java学院整理

下面先给大家介绍下String、StringBuffer、StringBuilder区别,具体详情如下所示:

StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都 会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。既然可变和不可变都有了,为何还有一个StringBuilder呢?相信初期的你,在进行append时,一般都会选择StringBuffer吧!

先说一下集合的故事,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

接下来,我直接贴上测试过程和结果的代码,一目了然:

 public class StringTest {
   public static String BASEINFO = "Mr.Y";
   public static final int COUNT = 2000000;
   /**
   * 执行一项String赋值测试
   */
   public static void doStringTest() {
     String str = new String(BASEINFO);
     long starttime = System.currentTimeMillis();
     for (int i = 0; i < COUNT / 100; i++) {
       str = str + "miss";
     }
     long endtime = System.currentTimeMillis();
     System.out.println((endtime - starttime)
         + " millis has costed when used String.");
   }
   /**
   * 执行一项StringBuffer赋值测试
   */
   public static void doStringBufferTest() {
     StringBuffer sb = new StringBuffer(BASEINFO);
     long starttime = System.currentTimeMillis();
     for (int i = 0; i < COUNT; i++) {
       sb = sb.append("miss");
     }
     long endtime = System.currentTimeMillis();
     System.out.println((endtime - starttime)
         + " millis has costed when used StringBuffer.");
   }
   /**
   * 执行一项StringBuilder赋值测试
   */
   public static void doStringBuilderTest() {
     StringBuilder sb = new StringBuilder(BASEINFO);
     long starttime = System.currentTimeMillis();
     for (int i = 0; i < COUNT; i++) {
       sb = sb.append("miss");
     }
     long endtime = System.currentTimeMillis();
     System.out.println((endtime - starttime)
         + " millis has costed when used StringBuilder.");
   }
   /**
   * 测试StringBuffer遍历赋值结果
   *
   * @param mlist
   */
   public static void doStringBufferListTest(List<String> mlist) {
     StringBuffer sb = new StringBuffer();
     long starttime = System.currentTimeMillis();
     for (String string : mlist) {
       sb.append(string);
     }
     long endtime = System.currentTimeMillis();
     System.out.println(sb.toString() + "buffer cost:"
         + (endtime - starttime) + " millis");
   }
   /**
   * 测试StringBuilder迭代赋值结果
   *
   * @param mlist
   */
   public static void doStringBuilderListTest(List<String> mlist) {
     StringBuilder sb = new StringBuilder();
     long starttime = System.currentTimeMillis();
     for (Iterator<String> iterator = mlist.iterator(); iterator.hasNext();) {
       sb.append(iterator.next());
     }
     long endtime = System.currentTimeMillis();
     System.out.println(sb.toString() + "builder cost:"
         + (endtime - starttime) + " millis");
   }
   public static void main(String[] args) {
     doStringTest();
     doStringBufferTest();
     doStringBuilderTest();
     List<String> list = new ArrayList<String>();
     list.add(" I ");
     list.add(" like ");
     list.add(" BeiJing ");
     list.add(" tian ");
     list.add(" an ");
     list.add(" men ");
     list.add(" . ");
     doStringBufferListTest(list);
     doStringBuilderListTest(list);
   }
 } 

看一下执行结果:

2711 millis has costed when used String.
211 millis has costed when used StringBuffer.
141 millis has costed when used StringBuilder.
 I  like  BeiJing  tian  an  men  . buffer cost:1 millis
 I  like  BeiJing  tian  an  men  . builder cost:0 millis

从上面的结果可以看出,不考虑多线程,采用String对象时(我把Count/100),执行时间比其他两个都要高,而采用StringBuffer对象和采用StringBuilder对象的差别也比较明显。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;如果要保证线程安全,自然是StringBuffer。从后面List的测试结果可以看出,除了对多线程的支持不一样外,这两个类的使用方式和结果几乎没有任何差别。

以上所述是小编给大家介绍的Java中StringBuffer和StringBuilder_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Java 中String StringBuilder 与 StringBuffer详解及用法实例

    在Android/Java开发中,用来处理字符串常用的类有3种: String.StringBuilder.StringBuffer. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String VS StringBuffer String 类型和StringBuffer的主要性

  • Java String 和StringBuffer的详解及区别

    Java String 和StringBuffer的详解及区别 Java平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含 多个字符的字符数据.String类表示内容不可改变的字符串.而StringBuffer类表示内 容可以被修改的字符串. 当你知道字符数据要改变的时候你就可以使用StringBuffer.典型地,你可以使用StringBuffers来动态构造 字符数据.另外,String实现了equals方法,new String("abc"

  • Java StringBuilder和StringBuffer源码分析

    StringBuilder与StringBuffer是两个常用的操作字符串的类.大家都知道,StringBuilder是线程不安全的,而StringBuffer是线程安全的.前者是JDK1.5加入的,后者在JDK1.0就有了.下面分析一下它们的内部实现. 一.继承关系 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence public

  • 详细分析Java中String、StringBuffer、StringBuilder类的性能

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看API会发现,String.StringBuffer.StringBuilder都实现了 CharSequence接口,虽然它们都与字符串相关,但是其处理机制不同. String:是不可改变的量,也就是创建后就不能在修改了. StringBuffer:是一个可变字符串序列,它与String一样,在内存中保存的都是一个有序的字符串

  • JAVA中String类与StringBuffer类的区别

    在Java中有两种字符串的操作:String类和StringBuffer类(缓冲字符串处理类). 下面先简单的说一下两者的区别. String类和StringBuffer类都提供了相应的方法实现字符串的操作,但二者略有不同. (1) String类 该类一旦产生一个字符串,其对象就不可变.String类的内容和长度是固定的.如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现.虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成一个新的实例.系统为Stri

  • Java 中 String,StringBuffer 和 StringBuilder 的区别及用法

    1 简介 在 Java 语言中,共有 8 个基本的数据类型,分别为:byte.short.int.long.float.double.boolean 和 char,其中 char 类型用于表示单个字符,例如 a.b.c .A.B.C.& 这些大小写字母或者特殊字符等等.在实际的编程中,单个的字符并没有我们想象中用的那么频繁,反而是多个字符组成的"字符串"更为常见,但是在基本的数据类型中,并没有字符串这种数据类型.为了解决这个问题,Java 语言为我们提供了一个被 final 关

  • Java那点事——StringBuffer与StringBuilder原理与区别

    最近在找工作,考官问我一个简单的题目:"StringBuffer与StringBuilder的区别,它们的应用场景是什么?",下面小编答案分享给大家,方便以后大家学习,以此也做个备录. 其实只要找下Google大神就有答案了:StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全

  • java 中String和StringBuffer与StringBuilder的区别及使用方法

    java 中String和StringBuffer与StringBuilder的区别及使用方法 1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a"; //假设a指向地址0x0001 a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向

  • 详解Java中字符串缓冲区StringBuffer类的使用

    StringBuffer 是一个线程安全的可变的字符序列.它继承于AbstractStringBuilder,实现了CharSequence接口. StringBuilder 也是继承于AbstractStringBuilder的子类:但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的. StringBuffer 和 CharSequence之间的关系图如下: StringBuffer类和String一样,也用来代表字符串,只是由于StringB

  • java中 String和StringBuffer的区别实例详解

    java中 String和StringBuffer的区别实例详解 String: 是对象不是原始类型.            为不可变对象,一旦被创建,就不能修改它的值.            对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.            String 是final类,即不能被继承. StringBuffer: 是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象            它只能通过构造函数来建立,  

随机推荐