这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。

  1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

  String最慢的原因:

  String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:

1 String str="abc";
2 System.out.println(str);
3 str=str+"de";
4 System.out.println(str);

  如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

  而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

  另外,有时候我们会这样对字符串进行赋值

1 String str="abc"+"de";
2 StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
3 System.out.println(str);
4 System.out.println(stringBuilder.toString());

  这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和

  String str="abcde";

  是完全一样的,所以会很快,而如果写成下面这种形式

1 String str1="abc";
2 String str2="de";
3 String str=str1+str2;

  那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。

  2. 再来说线程安全

  在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

  3. 总结一下
  String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

String是一个被final修饰的终结类,创建了字符串以后就是不能被修改的,通过"+"或者new等方式创建都会在内存中新增对象,这样对于需要多次拼接字符串的算法来说,系统开销太大,不适合用于多个字符串拼接;

  StringBuilder和StringBuffer是为了解决上述问题而诞生的字符串拼接类;又由于java的语言特性-多线程。在实现字符串拼接的问题上需要考虑线程同步的问题,因此StingBuffer是用于同步的字符串拼接,而StingBuilder是不同步的(线程不安全的)。从哲学的角度来看,有得必有失,获得了线程同步的安全性,在性能方面必然有所损失,所以,线程同步的StringBuffer执行效率自然没有线程不同步的StingBuilder执行效率高。

转载于:https://www.cnblogs.com/duguo/p/10569691.html

Java中的String,StringBuilder,StringBuffer的区别相关推荐

  1. java中的String、StringBuffer和StringBuilder的详细分析

    目录 前言 1. 源码 1.1 String源码 1.2 StringBuffer源码 1.3 StringBuilder源码 2. 总结 前言 java中用于处理字符串常用的主要三个类 在开发中如何 ...

  2. Java基础学习总结(65)——Java中的String,StringBuilder和StringBuffer比较

    字符串,就是一系列字符的集合. Java里面提供了String,StringBuffer和StringBuilder三个类来封装字符串,其中StringBuilder类是到jdk 1.5才新增的.字符 ...

  3. Java中的String、StringBuffer、StringBuilder的区别和使用范围

    String String不可随便更改,把他当做常量就行. 但是String可以通过函数组合或者用format创建可复用的格式化字符串. StringBuffer.StringBuilder 想要多次 ...

  4. String Stringbuilder StringBuffer的区别和应用

    1.可变与不可变 1) String类中使用字符串数组来保存字符串.因为有final修饰,所以,String对象是不可变的 private final char vakue[]; 2) StringB ...

  5. java stringbuffer长度限制_Java中的String、StringBuffer和StringBuilder

    作为作为一个已经入了门的java程序猿,肯定对Java中的String.StringBuffer和StringBuilder都略有耳闻了,尤其是String 肯定是经常用的.但肯定你有一点很好奇,为什 ...

  6. stringbuffer的最大长度_Java中的String、StringBuffer和StringBuilder

    作为作为一个已经入了门的java程序猿,肯定对Java中的String.StringBuffer和StringBuilder都略有耳闻了,尤其是String 肯定是经常用的.但肯定你有一点很好奇,为什 ...

  7. 理解Java中的String

    1. String是如何实现的? 里面是char数组实现的,最新的版本换成了byte数组(ASCII占1位,中文的话占2位). 2. 字符串常量池 Java堆内存中一个特殊的存储区域,当创建一个Str ...

  8. Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  9. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

最新文章

  1. 【JSConf EU 2018】WebAssembly 的手工艺术
  2. 第十五周程序阅读-范型程序设计(4)
  3. UVa307 - Sticks(DFS+剪枝)
  4. IE7不能显示PNG
  5. python有几种打开方式_Python中几个以“__”开头的方法介绍总结
  6. Linux的find -print 和 -print0区别:换行不换行
  7. Git 实用技巧记录,看这篇你就明白了!
  8. 【HNOI2015】接水果【整体二分】【DFS序】【双区间转矩形】【扫描线】【树状数组】
  9. 牛客国庆集训派对day6T A- 2016【矩阵乘法】
  10. linux kernel and user space通信机制,Linux内核空间与用户空间通信机制地研究.doc
  11. [转]HDFS用户指南(中文版)
  12. 【POJ - 3347 】Kadj Squares (计算几何,思维 或 扫描线)
  13. 不会装系统?有这篇就够了!
  14. win服务器自动发邮件,asp.net基于windows服务实现定时发送邮件的方法
  15. BitMEX将于3月份分批推出DOT、YFI、UNI等六个币种的双币种永续合约
  16. 教你制作自己的linux
  17. Redis内存分配简单分析
  18. SQLServer2008不允许保存更改
  19. 【预测模型】基于粒子群算法优化最小二乘支持向量机lssvm实现预测附matlab源码
  20. 如何获取目标期刊的参考文献格式模板?

热门文章

  1. dataobject java_Object类和@Data注解
  2. Scrapy网络爬虫框架实际案例讲解,Python爬虫原来如此简单!
  3. 一个小白的转行Python的经历!
  4. PyTorch + NumPy这么做会降低模型准确率?
  5. 11门满分、10门99分、47门超95分……他却说自己是“学zha”
  6. 重磅!校友会2020中国大学排名出炉!为自己母校感到骄傲!
  7. android onserviceconnected_2019最新Android面试题
  8. Panoptic Segmentation论文笔记
  9. Win7下的内置FTP组件的设置详解
  10. 对mysql进行压力测试_mysqlslap对mysql进行压力测试