博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础001-String、StringBuffer、StringBuilder剖析
阅读量:6806 次
发布时间:2019-06-26

本文共 1860 字,大约阅读时间需要 6 分钟。


Java中关于字符串最常见的三种存储形式是:StringStringBufferStringBuilder。它们都是对象,而非基本数据类型。

其中,String是最常见的一种用于定义和存储字符串的形式。

下面我们将分析一下这三种Object的区别和使用场景。

首先我们看一下这三个类的源码:

源码

public final class String    implements java.io.Serializable, Comparable
, CharSequence { private final char value[]; // ...}复制代码
public final class StringBuffer    extends AbstractStringBuilder    implements java.io.Serializable, CharSequence {        //...        @Override    public synchronized int length() {        return count;    }        //...}复制代码
public final class StringBuilder    extends AbstractStringBuilder    implements java.io.Serializable, CharSequence {        //...        @Override    public StringBuilder append(String str) {        super.append(str);        return this;    }           //...}复制代码
abstract class AbstractStringBuilder implements Appendable, CharSequence {    char[] value;}复制代码

三者的区别

从源码可以发现,String、StringBuilder、StringBuffer都是用char数组来存储String的。三者之间的区别在于:

  1. String利用final char[]存储数据,而另外两者则是char[]。这意味着String是不可变的,而StringBuilderStringBuffer则是可变的。

    这里引用Matrix海子的一句话对此进行总结:对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象

  2. 从线程安全性上看:String是常量,那就是线程安全的。StringBuilder的方法没有加同步锁,而StringBuffer的对方法加了同步锁,所以StringBuilder是非线程安全的。

  3. 从性能上看,String发生改变时,总会创建新的String对象,而后将指针指向这个新的String对象。而java的垃圾收集是通过JVM的GC进行的,这样就导致假如下一次GC还未启动,已经产生了大量的不再被使用的String对象,那么就会大大影响到系统性能。

    StringBuilder和StringBuffer都是对对象本身进行操作的,所以不会造成性能问题。相同情况下,使用StringBuilder比StringBuffer能获得10%~15%的性能提升,但有可能会造成线程不安全问题。


三者的使用情况

总结String、StringBuilder和StringBuffer的使用情况:

  1. 在单线程情况下,如果字符串change操作较少,建议使用String。如果change操作较多,建议使用StringBuilder——在idea开发环境中,如在一个for循环中连接字符串,会自动提示应该使用StringBuilder的append而不是String本身。
  2. 在多线程情况下,如果字符串change操作较少,同样使用String。否则建议使用StringBuffer。

有关String、StringBuilder和StringBuffer的相关知识就总结到这里。如有失误,请谅解,欢迎大家指正!

参考:

  1. JavaGuide--
  2. Matrix海子--

转载于:https://juejin.im/post/5cd51f82f265da035d0c97df

你可能感兴趣的文章
淘富成真,硬件智能—— 硬件创新一站赋能平台
查看>>
网友神总结:我们继续用 XP 的十大理由
查看>>
2014年8月份国内主浏览器市场份额排行榜
查看>>
《Storm实时数据处理》一导读
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.2 recvfrom和sendto函数
查看>>
《数据结构与抽象:Java语言描述(原书第4版)》一第2章
查看>>
初学者指南:为开源做贡献
查看>>
OVM 免费虚拟化软件迭代时间调整,提高产品稳定性!
查看>>
《Windows Server 2012 Hyper-V虚拟化管理实践》——2.3 Hyper-V角色安装后的状态
查看>>
《电子元器件的可靠性》——3.7节电子元器件失效率鉴定试验
查看>>
SYNPROXY:廉价的抗 DoS 攻击方案
查看>>
《计算机系统:系统架构与操作系统的高度集成》——2.5 高级数据抽象
查看>>
Fit项目分页组件的编写
查看>>
国产操作系统思普将起诉微软涉嫌“商业诋毁”
查看>>
《Android游戏编程入门经典》——4.6节问与答
查看>>
TouchVG 支持 CocoaPods 了!
查看>>
如何在 Ubuntu 16.10 的 Unity 8 上运行老式 Xorg 程序
查看>>
《Python机器学习——预测分析核心算法》——2.3 对“岩石vs.水雷”数据集属性的可视化展示...
查看>>
机器学习初学者入门实践:怎样轻松创造高精度分类网络
查看>>
Ruby Tip:定义索引操作符
查看>>