Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder.

区别

三者都继承自CharSequence接口, 首先说明三者间主要区别

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

String

在Java中String对象是不可变的. 每次改变String类型的时候都会生成一个新的String对象, 然后将指针指向新的String对象.

如下代码中, str最终的值"ab"并非str所引用对象的内容发生了变化, 而是str在执行的过程中重新引用了另外一个String对象"ab". 并且String的+操作, 会转化成StringBuilder的append()方法来实现.

String str = "a";
str += "b"; 

特别的, 如果代码如下这样直接拼接字符串的话, 在编译过程中JVM会直接优化成把str的引用指向"ab".

String str = "a" + "b"; 

StringBuilder和StringBuffer

StringBuffer和StringBuilder都可变, 区别在于StringBuilder是线程不安全的, 而StringBuffer的API前多了一个synchronized关键字, 所以StringBuffer是线程安全的. 所谓的线程安全就是在多线程中多个线程同时操作一个对象不会出现问题. 然而真实的应用场景中, 还真没怎么见过有多个线程轮流操作一个字符串的情况.

实际上StringBuilder是在JDK 1.5中才加上的, 之前只有StringBuffer, 写过几年C#的我很是怀疑StringBuilder的这个命名是从C#借鉴来的. 至于为什么先有一个线程安全的StringBuffer后来再有一个线程不安全的StringBuilder, 而且从两者的命名来看你压根区分不出哪个是线程安全的, 个人感觉这应该是一个设计失误吧...

StringBuffer和StringBuilder都继承自AbstractStringBuilder, 而AbstractStringBuilder里有个expandCapacity方法用来扩容, 这就导致了StringBuffer和StringBuilder中另外一个重要的问题, 就是初始化时的容量问题.

StringBuilder扩容的问题

在StringBuilder中有一个char[], 初始的容量是16. 那么问题来了, 如果要append的长度超过了16, 会发生什么?

答案是会调用expandCapacity, 成倍扩容! 所以在高性能场景下StringBuilder的初始长度很重要很重要.

void expandCapacity(int minimumCapacity) { int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity; if (newCapacity < 0) { if (minimumCapacity < 0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } value = Arrays.copyOf(value, newCapacity); } 

初始长度太小扩容时会带来时间消耗, 初始长度太大又会带来空间消耗. 可以参考这里的用法来复用StringBuilder.

转载于:https://www.cnblogs.com/ldm1989/p/7216657.html

Java中String, StringBuilder和StringBuffer相关推荐

  1. Java中的StringBuilder和StringBuffer

    1. StringBuilder: 由于String是不变对象,每次修改内容都会创建新的对象,因此String不适合频繁修改操作,为了解决这个问题,java提供了StringBuilder类. Str ...

  2. Java中string拼接,StringBuilder,StringBuffer和+

    Java中string拼接,StringBuilder,StringBuffer和+,到底哪个更合适? StringBuilder线程不安全,效率较线程安全的StringBuffer高.jdk1.5之 ...

  3. Java中String、StringBuffer、StringBuilder的区别

    Java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

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

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

  5. Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  6. 【翻译】Java中String, StringBuffer, StringBuilder的区别

    2019独角兽企业重金招聘Python工程师标准>>> String 是  Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著 ...

  7. Java char jdk_java学习系列之二---字符串(char.String.StringBuilder以及StringBuffer)

    一.String 1.String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的.String类是被final修饰 2.String str="hel ...

  8. Java 集合 --- String, StringBuilder, StringBuffer

    Java 集合 --- String, StringBuilder, StringBuffer String String的声明方式 String的不可变性 对比两个String StringBuil ...

  9. Java中string与String区别_JAVA中String与StringBuffer的区别

    JAVA中String与StringBuffer的区别 2009-12-3文字大小:大中小 在java中有3个类来负责字符的操作. 1.Character 是执行 单个字符操作的, 2.String ...

  10. Java中String,StringBuffer都是final类

    Java中String和StringBuffer同时final类,它们的区别在哪里 ? final 表示这个类不能再被继承.String不可变是说String中用一个final 的char数组priv ...

最新文章

  1. 手把手教你JavaEE的分页查询、分页展示,有了这个,你的项目又多了一个谈资
  2. iis下 ActiveSync插件无法访问(下)
  3. Android Studio 新建drawable-hdpi、drawable-mdpi等
  4. 如何更有效WEB应用防火墙确保信息安全
  5. SqlServer2008 安装经验日志总结
  6. 阿里云佘俊泉:创新探索不停,边缘云持续为客户创造价值
  7. Java并发编程之LinkedBlockingQueue
  8. 外链引入css有哪些方式_CSS 文件的4种引入方式
  9. jquery mysql实现加入购物车_使用jQuery实现购物车结算功能
  10. Atitit.软件开发的几大规则,法则,与原则。。。attilax总结
  11. Python 正则表达模块详解
  12. 2022 年面向开发人员的七个优秀 Java IDE
  13. css插件载进去ps里面,CSS3Ps(ps图层插件)官方版
  14. python中常数e_常数python_python 常数_python 常数e - 云+社区 - 腾讯云
  15. 利用FPGA实现简单的CPU
  16. 利用windows 系统的画图工具获取图片上某一点的颜色RGB值
  17. 关于自己搭建的邮件被微软反垃圾邮件标记为垃圾邮件
  18. 对前端工程化、模块化、组件化开发的理解
  19. 【NOIP2014提高组】飞扬的小鸟
  20. iOS-Xcode8新特性(Code signing is required for product type 'Application' in SDK 'iOS 10.0')

热门文章

  1. JDK1.8源码(十一)——java.util.TreeMap类
  2. Outlook中的Notes的链接打不开,提示错误信息“File does not exit”
  3. [转]paint,update和repaint三种awt方法
  4. [转]unresolved external symbol _*
  5. spring 事务案例--转账
  6. linux移植简介[MS2]
  7. DirectFB 之 FillRectangle 绘制矩形
  8. WCF如何使用X509证书(安装和错误)(二)
  9. JavaScript动态网页制作宝库
  10. 基于Dialog的MFC程序在启动时隐藏为托盘程序(三)