String 字符串常量
StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)

简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;
 StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
 String S1 = “This is only a” + “ simple” + “test”; 其实就是:
 String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做

在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

String为什么是不可变的

String和StringBuffer都是final类,他们生成的对象在堆中都是不可变的,在他们内部都是靠属性char数组实现的,

那为什么StringBuffer可以在对象中追加字符串呢?呵呵,因为String中的char数组是final的,也就是常量,是不可改变的,而StringBuffer继承自抽象类AbstractStringBuilder,他的内部实现靠他的父类完成,AbstractStringBuilder内的char数组是变量,可以用append追加

StringBuffer和StringBuilder都实现了AbstractStringBuilder抽象类,此抽象类实现Appendable接口因此可追加
(在JDK 6.0 API中StringBuilder和Stringbuffer写着都继承自Object 而且在他的API中找不到AbstractStringBuilder类)

String,StringBuffer与StringBuilder的区别以及String为什么是不可变的?相关推荐

  1. String,StringBuffer与StringBuilder的区别

    String,StringBuffer与StringBuilder的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...

  2. String,StringBuffer与StringBuilder的区别??

    2019独角兽企业重金招聘Python工程师标准>>> String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...

  3. String,StringBuffer与StringBuilder的区别?

    http://blog.csdn.net/rmn190/article/details/1492013 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuil ...

  4. String,StringBuffer和StringBuilder的区别

    一.可变性 不同于String类的不可变性,StringBuffer和StringBuilder都继承了抽象类AbstractStringBuilder,这个类用一个char数组来存储value. a ...

  5. Java 之String、StringBuffer 和 StringBuilder 三者区别介绍

    String:字符串常量,字符串长度不可变,StringBuffer:字符串变量(Synchronized,即线程安全),StringBuilder:字符串变量(非线程安全). String Stri ...

  6. php 有 stringbuffer,string,stringbuffer以及stringbuilder的区别

    string,stringbuffer以及stringbuilder的区别? 小编在一次电话面试中,被问过StringBuilder是线程安全的吗,脱口而出是安全的,结果人家质疑我你是2年开发经验吗. ...

  7. JavaSE(二十五)——String与StringBuffer、StringBuilder的区别、创建对象的几种方法、Http和Https的区别

    文章目录 1. String与StringBuffer.StringBuilder的区别 2. Java创建对象的几种方法 3. Http和Https的区别 1. String与StringBuffe ...

  8. 【转】Java:String、StringBuffer和StringBuilder的区别

    1 String String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的. String类的包含如下定义: [java] view plaincopy /* ...

  9. String、StringBuffer与StringBuilder之间区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

最新文章

  1. leetcode最大矩形_LeetCode——最大矩形
  2. python 柱形图 负值_Highcharts 使用负值的反向柱形图
  3. [swustoj 856] Huge Tree
  4. java的乐趣_分享java带来的快乐
  5. python用于数据处理真的那么强大嘛_为什么有那么多人选择Python,真的有那么好吗?...
  6. 贺利坚老师汇编课程55笔记:带借位减法指令SBB
  7. Atitit 返回http500返回码,以及自定义返回提示 目录 1. 可以看到从php发送http响应代码的三种方法: 1 1.1. Header(HTTP/1.1 404 Not Found
  8. buuctf|ciscn_2019_en_2 1
  9. AWTK-MVVM 在 STM32H743 上的移植笔记
  10. 热加工作业考研题目答案分享——metal casting 1
  11. 延禧攻略插曲6首歌词+简谱
  12. team viewer如何解绑设备
  13. 关于数据库大小写的问题
  14. python中xpath使用案例_python爬虫学习笔记:XPath语法和使用示例
  15. 前端三件套之JS速成
  16. 7-24 到底是不是太胖了 (10分)
  17. 基于C#的Modbus的(NModbus)研究(DTS686电表)——实现TCP通信连接(二)
  18. java 阿里云接口实现发送短信验证码
  19. 超大数据10进制转2进制详解(可推广到其他进制)/ Codeup 100000579 问题 C: 进制转换
  20. 如何基于Miniconda使用Pycharm调用Gurobi

热门文章

  1. 一个程序员修炼之道《论程序员的自我修养》
  2. SYSBIOS读书笔记
  3. X86 第一条CPU指令及BIOS Shadow
  4. 华硕主板固态硬盘不识别_华硕b360主板bios不识别m.2固态怎么办?
  5. 嵌入式Linux获取系统时间
  6. c语言程序怎么记忆,c语言的记忆方法指导
  7. FastDFS收藏起来,现在开始用Minio吧
  8. 1030 习题3-1 计算国民生产总值增长倍数
  9. 培训班出来的人后来都怎么样了?(三)
  10. 联发科处理器手机安装linux,BQ Aquaris Ubuntu 智能手机配 4.5 英寸屏幕四核CPU