Java中String类StringBuffer类和StringBuilder类的区别

秒速五厘米 2022-08-07 11:56 298阅读 0赞

首先阐述String类和StringBuffer类的区别,String类是常量,不能添加,而StringBuffer则是一个字符缓冲区,可以往里面添加字符串。比如说:

  1. <span style="font-size:18px;">String str = "helloworld";
  2. str += "welcome";</span>

这里其实过程是这样的:生成了String对象 “helloworld” 引用由str持有, 当执行 str += “welcome” ; 这行代码的时候其实是废弃了 原来的 “helloworld”对象 然后产生了新的拼接之后的对象,然后把引用赋给了str。 所以过程中又生成了新的String类型的对象,然后原来的对象就要被垃圾回收器回收。肯定是要影响程序的性能。

那么,我们现在再来看一看StringBuffer的做法

  1. <span style="font-size:18px;">StringBuffer sb = new StringBuffer("helloworld");
  2. sb.append("welcome");</span>

StringBuffer的过程是这样的。首先构造出一个StringBuffer对象,在缓冲区中,让后可以在缓冲区中直接添加指定的字符串序列。

还有一种写法肯定是错的 :

StringBuffer sb = new StringBuffer();

sb = “helloworld”; //字符串对象怎么能赋给StringBuffer对象呢?

然后下面的测试String 类和StringBuffer类的性能测试代码段

执行效果不绝对,因每一台机子的硬件配置而定。

首先是String类的性能

  1. <span style="font-size:18px;">/* 本代码段测试String类的性能 约2854毫秒
  2. String tempValue = "helloworld";
  3. int times = 10000;
  4. String value = "";
  5. long startTime = System.currentTimeMillis();
  6. for(int i = 0 ;i < times ; i++)
  7. {
  8. value += tempValue;
  9. }
  10. long endTime = System.currentTimeMillis();
  11. System.out.println(endTime - startTime);
  12. */</span>

然后是StringBuffer类

  1. <span style="font-size:18px;">/* 本代码段用于测试StringBuffer类的性能 约为10毫秒
  2. String tempValue = "helloworld";
  3. int times = 10000;
  4. StringBuffer sb = new StringBuffer();
  5. long startTime = System.currentTimeMillis();
  6. for(int i = 0 ; i < times ; i++)
  7. {
  8. sb.append(tempValue);
  9. }
  10. long endTime = System.currentTimeMillis();
  11. System.out.println(endTime - startTime);
  12. */</span>

在一个就是StringBuilder 和StringBuffer类的比较

怎么说的StringBuilder类是从JDK5.0开始出现的类。用来替代StringBuffer 。但是不保证线程安全。如果你需要这种同步,请使用StringBuffer类,StringBuilder类是线程不安全的。而StringBuffer是线程安全的。

性能上来说StringBuilder是比StringBuffer的性能要强那么一点点,但是两个类总体上的使用方法是差不多的。

一下是测试StringBuilder类的性能的测试代码段。

  1. <span style="font-size:18px;">/* 本代码段用于测试 StringBuilder类的性能 约10毫秒
  2. String tempValue = "helloworld";
  3. int times = 10000;
  4. StringBuilder sb = new StringBuilder();
  5. long startTime = System.currentTimeMillis();
  6. for(int i = 0 ; i < times ; i++)
  7. {
  8. sb.append(tempValue);
  9. }
  10. long endTime = System.currentTimeMillis();
  11. System.out.println(endTime - startTime);
  12. */</span>

综上所述:如果你使用的是常量的要多一些,还请使用String类 ,如果经常改变值,还请使用StringBuffer 或StringBuilder。

一般来说性能上 StringBuilder > StringBuffer > String

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读