StringBuffer 和 StringBuilder区别简介

Java  小知识  2021年11月22日 pm7:16发布3年前 (2021)更新 城堡大人
107 0 0

前言

StringBufferStringBuilder虽然经常用,但偶尔忘记他们之间的区别,这里简单整(摘)理(抄)一下,方便自己查阅。

PS:好记性不如烂笔头

正文

StringBuffer 和 StringBuilder都是可变的字符串,但他们两之前还是有不少的区别。

StringBuffer和StringBuilder的类结构

StringBuffer 和 StringBuilder区别简介

从上面可以看出,他们都继承AbstractStringBuilder,当具体使用起来就存在区别了。

StringBuffer和StringBuilder的区别

StringBuffer和StringBuilder存在如下几个区别:

1. 线程安全

StringBuffer 是线程安全的,其的方法中有synchronized 修饰。

StringBuilder 是线程不安全的。

因此,在安全方面,StringBuilder优秀。

2. 性能

接上面线程安全和线程不安全,由于带有锁(synchronized修饰),导致访问的方法都同步的,也就存在访问一个方法另一个方法就需要等着。

因此,在性能上,StringBuffer比StringBuilder差。

3. 缓冲区

StringBuffer 代码片段:

private transient char[] toStringCache;

@Override
public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

StringBuilder 代码片段:

@Override
public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
}

可以看出,StringBuffer每次获取toString都会直接使用缓存区的toStringCache值来构造一个字符串。

而StringBuilder则每次都需要复制一次字符数组,会再创建一个字符串。

缓存冲是对StringBuffer的一个优化,但StringBuffer的toString是有Synchronized修饰。

因此,StringBuffer和StringBuilder各打五十大板。

总结

如果整理来看,StringBuilder和StringBuffer各有优缺点,也就各打五十大板。

如果我们在不同场合使用不同的,就可以发挥其的优点。

适合的场合

StringBuffer 适合 : 多线程

StringBuilder 适合 : 单线程

参考文章

  1. StringBuffer 和 StringBuilder 的 3 个区别

 历史上的今天

  1. 2024: Android数据库升序或降序查询(0条评论)
  2. 2023: Date常用格式转换(0条评论)
  3. 2019: 卢梭:生活在大自然的怀抱里(0条评论)
  4. 2018: 开机动画文件制作以及注意事项(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

TextView.setWidth()竟然失效了

前言TextView.setWidth()失效(无作用),其实好奇,既然没作用,为啥要预留这个方法呢?记录一下,方便自己查阅。正文既然要刨根问底,就需要看源码TextView。看了一下源码TextView.setWidth()//[来自谷歌翻译]//将 TextView 的宽度设置为...

RecyclerView对Item拖动和上下滑动记录

前言简单的记录RecyclerView对Item的拖拽和上下滑动的使用。如果只是简单功能ListView就可以搞定,但是如果需要复杂点的,比如拖拽等,用recyclerview就可以完美解决。recyclerview可以借助ItemTouchHelper实现拖动和滑动删除功能,本文就简单的记...

Android新增开关安装apk选项

前言记录一下,Android中设置一个开关进行判断是否允许用户自己安装apk。记录于此,方便自己查阅。正文frameworks/base/services/core/java/com/android/server/pm/PackageInstallerService.java@Overr...

MediaPlayer JNI层介绍

前言之前的《MediaPlayer java层介绍》只是介绍了java中的常用方法,对于JNI层的调用没有进一步介绍,今天就介绍一下JNI层。个人流水账哈,推荐看其他人的,我这只是自己的跟踪记录涉及的代码:frameworks\base\media\java\android\media\M...

Android Studio重构清除无引用资源

前言Android开发中,发现移植的APP模块存有很多图片和xml等资源,至于是否有引用,不去查询是不太好知道的。但是Android Studio有个功能,也就是Android Studio Refactor/Remove Unused Resources【重构,移除没有引用的资源】。PS:...

[摘]Android源码之init.rc文件规则和init.c解析

前言本文主要讲解Android源码之init.rc文件规则和init.c解析。本文摘抄网上大牛的文章(链接文末),方便自己查阅。多谢分享。正文init.c与init.rc在源码中的位置:init.c : /system/core/initinit.rc : /system/core...