java gson 解析string_Java之——深入解析String、StringBuffer、StringBuiler
要说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相关推荐
- java读取文件 string_java读取文件为string
java读取文件为string qdt 文件 tof cin .com user mar oci JA卜嗜9MCSI儇凭EUhttp://www.docin.com/app ...
- Java对【JSON数据的解析】--Gson解析法
Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 两者异同点: 相同点:都是根据JSON数据创建相应的类不同点:1.调用方式区别谷歌:方法都是非静态的,需要先创建对象 ...
- Java对【JSON数据的解析】--fastjson解析法
要求:解析下面JSON数据 String string = "{no:1,name:'Android',employees:[{name:'zhangsan',age:20},{name:' ...
- gson 解析json_Gson示例教程解析JSON
gson 解析json Welcome to Gson Example Tutorial. In last post we looked at the Java JSON API and you ca ...
- java如何从地址串中解析提取省市区(完美匹配中国所有地址)
https://download.csdn.net/download/cncjh/12249234 java如何从地址串中解析提取省市区(完美匹配中国所有地址) / 张生荣 java从地址串中解析提取 ...
- java构造和解析json_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- java 二维码生成和解析
2019独角兽企业重金招聘Python工程师标准>>> <!-- 二维码 --><dependency><groupId>com.google.z ...
- atitit. java jsoup html table的读取解析 总结
atitit. java jsoup html table的读取解析 总结 1. 两个大的parser ,,,jsoup 跟个 htmlparser 1 2. 资料比较 1 3. jsoup越佳. ...
- java中构造方法和方法全面解析
java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...
最新文章
- XenServer和VMware vSphere技术比较
- Jenkins的关闭、重启
- 解决python调用TensorFlow时出现FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecate
- homepod换wifi网络_如何实现短租网络自由,不必换房断网
- python怎么画参数函数图像_详解pandas.DataFrame.plot() 画图函数
- 任务计划命令 linux,linux执行一次性任务计划at命令
- Cannot delete .... . Name node is in safe mode
- 2016-08-31
- 生成osm文件_[转载]OSM数据的获取及格式转换
- 判断客户端是手机端还是PC端
- 居家办公提高工作效率的八点建议
- 主键外键超键候选键的联系和区别_主键、外键、超键、候选键
- CS61C Spring 2021——Project 3: CS61CPU要求及实现思路
- 朋友圈加粗字体数字_微信更新!朋友圈评论能发表情包,结果变成沙雕狂欢
- 获得手机上的软件名称 软件图标 软件包名
- C语言结构、联合、位操作、位域和枚举
- 云南怒江---地狱与天堂的边缘
- C++:堆和栈的理解
- TCP三次握手四次挥手简介
- 如何更改您的Apple Watch表带(不花一吨)
热门文章
- JSONP实现Ajax跨域请求
- Picasso fit() centerCrip() centerInside()
- php53 的mcrypt模块 , 需要用源代码进行安装
- 形象!Google Earth增实时雨雪演示功能
- ai里为什么不能随意放大缩小_平面设计基础知识:平面设计师应该熟练掌握的软件之AI。...
- 区块链开发指南_区块链钱包开发
- scala mysql bit_Scala连接mysql数据库
- 命令行启动ssh_如何在虚拟机中正确的第一次启动Linux系统
- java未将对象引用设置_未将对象引用到实例怎么解决_常见问题解析,java
- SVN配置自启动服务碰到[SC] OpenSCManager 失败 5:解决办法