要说Java中什么哪个类用的最频繁,要数String类了。所以说,关于String 、StringBuffer、StringBuilder 是有必要详细研究一下的。

那么这三者之间有什么区别,如何根据场景来选择使用,本文将基于三者的源码、性能、以及面试常问点来进行分析。


String 类

我们先看看String的源码,看看Sting到底是个什么样的类

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0/** use serialVersionUID from JDK 1.0.2 for interoperability */private static final long serialVersionUID = -6849794470754667710L;/*** Class String is special cased within the Serialization Stream Protocol.** A String instance is written into an ObjectOutputStream according to* <a href="{@docRoot}/../platform/serialization/spec/output.html">* Object Serialization Specification, Section 6.2, "Stream Elements"</a>*/private static final ObjectStreamField[] serialPersistentFields =new ObjectStreamField[0];

可见,String类实现了CharSequence 接口,也就是说 String 是 CharSequence 类型。而且它是被final修饰的类,且底层的字符数组也是被final修饰的,这就意味着一旦String被定义之后就是固定的,不可改变的。

今天之所以要引入这个话题,是因为在做字符串拼接时的效率问题进行分析,我们在做简单的字符串拼接时,底层原理其实是创建新对象和回收旧对象的过程,这其中牵扯到了GC(垃圾回收机制),举个例子就明白了

 String s1 = "abc" ;//1s1 = s1 + "d" ;//2System.out.println(s1);//3

可以看出,首先定义一个字符串s1,赋值为"abc",在执行第二行代码时,其实就是在原有s1的基础上拼接一个新的字符串"d",然后形成新的s1打印输出。

这个过程中,GC会回收旧的s1对象,同时创建新的对象(s1),但是这样的拼接过程在涉及到大量的字符串拼接时,就显得捉襟见肘了。

所以要想办法优化一下字符拼接,所以就出现了StringBuffer以及StringBuiler。

StringBuffer 类

StringBuffer 类继承自类AbstractStringBuilder,AbstractStringBuilder 类封装了大量基础方法,包括数组扩容机制、拼接方法等。

StringBuffer 初始化时默认长度大小为 16,它的扩容方式是在旧的数据上乘以 2 并加 2 进行扩容,StringBuffer实现字符串拼接用到了append 方法,这里摘抄一下append 方法的源码

 @Overridepublic synchronized StringBuffer append(Object obj) {toStringCache = null;super.append(String.valueOf(obj));return this;}@Overridepublic synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;}

可以看到,Stringbuffer底层的append方法是被synchronized标识的,因此StringBuffer是线程安全的,所以总的来说,StringBuffer提高了线程安全性,但是牺牲了效率。

StringBuiler 类

StringBuilder 与 StringBuffer 是类似的,都是继承自AbstractStringBuilder,所以很多功能都相似,但是不同的是它们的append方法不同,StringBuilder的append方法,不是由synchronized标识,所以相对于StringBuffer来说,StringBuilder不是线程安全的。

 @Overridepublic StringBuilder append(Object obj) {return append(String.valueOf(obj));}@Overridepublic StringBuilder append(String str) {super.append(str);return this;}

所以说,StringBuffer和StringBuilder相对于String来说,极大地提高了字符串拼接的效率,在使用时选择怎样选择呢?

一般的话,对于字符串拼接较少、字符串变化较小的的情况,可以选择String

当字符串连接操作比较频繁,且要求线程安全(多线程环境下操作)时,选择StringBuffer

而StringBuiler 适用于字符串连接操作比较频繁,且是单线程的情况。

java gson 解析string_Java之——深入解析String、StringBuffer、StringBuiler相关推荐

  1. java读取文件 string_java读取文件为string

    java读取文件为string qdt   文件   tof   cin   .com   user   mar   oci JA卜嗜9MCSI儇凭EUhttp://www.docin.com/app ...

  2. Java对【JSON数据的解析】--Gson解析法

    Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 两者异同点: 相同点:都是根据JSON数据创建相应的类不同点:1.调用方式区别谷歌:方法都是非静态的,需要先创建对象 ...

  3. Java对【JSON数据的解析】--fastjson解析法

    要求:解析下面JSON数据 String string = "{no:1,name:'Android',employees:[{name:'zhangsan',age:20},{name:' ...

  4. gson 解析json_Gson示例教程解析JSON

    gson 解析json Welcome to Gson Example Tutorial. In last post we looked at the Java JSON API and you ca ...

  5. java如何从地址串中解析提取省市区(完美匹配中国所有地址)

    https://download.csdn.net/download/cncjh/12249234 java如何从地址串中解析提取省市区(完美匹配中国所有地址) / 张生荣 java从地址串中解析提取 ...

  6. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  7. java 二维码生成和解析

    2019独角兽企业重金招聘Python工程师标准>>> <!-- 二维码 --><dependency><groupId>com.google.z ...

  8. atitit. java jsoup html table的读取解析 总结

    atitit. java jsoup html table的读取解析 总结 1. 两个大的parser ,,,jsoup 跟个   htmlparser 1 2. 资料比较 1 3. jsoup越佳. ...

  9. java中构造方法和方法全面解析

    java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...

最新文章

  1. XenServer和VMware vSphere技术比较
  2. Jenkins的关闭、重启
  3. 解决python调用TensorFlow时出现FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecate
  4. homepod换wifi网络_如何实现短租网络自由,不必换房断网
  5. python怎么画参数函数图像_详解pandas.DataFrame.plot() 画图函数
  6. 任务计划命令 linux,linux执行一次性任务计划at命令
  7. Cannot delete .... . Name node is in safe mode
  8. 2016-08-31
  9. 生成osm文件_[转载]OSM数据的获取及格式转换
  10. 判断客户端是手机端还是PC端
  11. 居家办公提高工作效率的八点建议
  12. 主键外键超键候选键的联系和区别_主键、外键、超键、候选键
  13. CS61C Spring 2021——Project 3: CS61CPU要求及实现思路
  14. 朋友圈加粗字体数字_微信更新!朋友圈评论能发表情包,结果变成沙雕狂欢
  15. 获得手机上的软件名称 软件图标 软件包名
  16. C语言结构、联合、位操作、位域和枚举
  17. 云南怒江---地狱与天堂的边缘
  18. C++:堆和栈的理解
  19. TCP三次握手四次挥手简介
  20. 如何更改您的Apple Watch表带(不花一吨)

热门文章

  1. JSONP实现Ajax跨域请求
  2. Picasso fit() centerCrip() centerInside()
  3. php53 的mcrypt模块 , 需要用源代码进行安装
  4. 形象!Google Earth增实时雨雪演示功能
  5. ai里为什么不能随意放大缩小_平面设计基础知识:平面设计师应该熟练掌握的软件之AI。...
  6. 区块链开发指南_区块链钱包开发
  7. scala mysql bit_Scala连接mysql数据库
  8. 命令行启动ssh_如何在虚拟机中正确的第一次启动Linux系统
  9. java未将对象引用设置_未将对象引用到实例怎么解决_常见问题解析,java
  10. SVN配置自启动服务碰到[SC] OpenSCManager 失败 5:解决办法