String,StringBuilder,StringBuffer三者之间的区别
发布日期:2022-02-27 02:37:54 浏览次数:38 分类:技术文章

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

String,StringBuilder,StringBuffer三者都是对字符串的操作,在这里我们简单的说一下它们之间的去区别;

一:String

String操作字符串,被String修饰的变量是定长且不可改变的,若想对被修饰的字符串修改,使用+号拼接,此时会返回一个新的对象,而不是原本的对象;对于为什么定长且不可变;这里看一下源码;

public final class String    implements java.io.Serializable, Comparable
, CharSequence { /** The value is used for character storage. */ private final char value[];// jdk1.8

在这里可以看到源码中,String底层是一个由final修饰的char数组(jdk1.8即之前);在jdk1.9后,采用的是byte数组,在这里可以看一下源码;

@Stable //表示下方属性 最多被赋值1次!private final byte[] value;// jdk1.9

由于是有final修饰,所以是定长不可变,在上面的源码中也看到了,String本身类也是由final修饰的,所以String类也是不可被继承的;

二:StringBuilder与StringBuffer

相比于String来说,他们的优势就在于对字符串的操作更加的灵活多变了,使用他的一些方法,如append();对字符串进行增加,返回的对象是当前对象的本身,并不会返回新的对象。

而StringBuilder和StringBuffer这二者的主要区别在于线程安全问题;在源码中显示他们都继承于AbstractStringBuilder抽象类;

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{...}
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{...}

现在来看看在他们的父类当中是如何造成线程安全问题的,又是采用什么方法如何解决线程安全问题的;

public AbstractStringBuilder append(String str) {    if (str == null)        return appendNull();    int len = str.length();    ensureCapacityInternal(count + len);    str.getChars(0, len, value, count);    count += len;    return this;}

在源码中不难看出,方法中有一个+=的操作,此操作并不是一个原子性的操作,如此一来线程安全问题就出现了;

那么又是如何解决的这个问题呢?接下来看看StringBuilder和StringBuffer的源码:

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

原来他们的差别在于方法有无synchronized关键字的修饰;在StringBuffer的底层方法中使用到了synchronized锁的机制,锁住方法,保证了线程的安全;而StringBuilder中并没有采用这种机制,直接调用父类的方法;父类的非原子性操作给它带来了线程安全问题。

所以就形成了他们两者的使用场景不同:

在多线程大数据量中使用StringBuffer;在单线程大数据量中使用StringBuilder

转载地址:https://blog.csdn.net/weixin_43398098/article/details/118409473 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringBoot集成EasyPoi的基本使用(注解导出和模板导出)
下一篇:ArrayList和LinkedList的底层原码分析

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月11日 16时37分56秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

dns改成什么网速快_这个DNS服务器不仅更快而且安全 2019-04-21
增大表名最大长度_让1人测量飞机40米长度,钢卷尺很难搞定,小米激光测距仪来帮你... 2019-04-21
5单个编译总会编译全部_速度与激情:Webpack5 & 极速编译 2019-04-21
用etree解析xml_用 Python 抓取 bilibili 弹幕并分析! 2019-04-21
检查域名是否可以访问_医用检查手套是否可以重复使用? 2019-04-21
如何区分用户_通信中的多址技术:基站如何区分不同用户,时分与频分多址技术... 2019-04-21
div旋转 vue_Vue实现按钮旋转和移动位置的实例代码_蜡烛_前端开发者 2019-04-21
switchresx卸载_SwitchResX 2019-04-21
python游走代码_python实现BA网络选取节点(deepwalk选取下一个游走节点) 2019-04-21
java sublist_java中利用List的subList方法实现对List分页(简单易学) 2019-04-21
mac电脑循环次数多少算新_苹果电脑电池循环次数多少才正常? 2019-04-21
10000内的亲密数_RICKYOUNG圣诞内购会 | 把暖冬快乐送给你 2019-04-21
calendar.getinstance()获取的是什么时间_为什么建议使用 LocalDateTime 而不是 Date 2019-04-21
linux重启后文件丢失_linux文件系统数据丢失恢复的过程 2019-04-21
uniapp 录音_uni-app 长按录音优化组件 2019-04-21
vue 中indexof_JS数组中的indexOf方法 2019-04-21
java mysql 单例模式_mysql jdbc1 数据库连接 单例模式实例 2019-04-21
2017年java漏洞_【漏洞公告】Oracle多个Java漏洞更新-2017年7月 2019-04-21
linux刻录win10u盘_在Ubuntu Linux下制作Windows 启动安装 USB盘 2019-04-21
linux按照mysql为何如此简单_MySQL菜鸟实录(一):服务安装扫盲(Linux & Windows)... 2019-04-21