StringBuilder&StringBuffer

StringBuilder&StringBuffer

Stringbuffer是一个线程安全的可变的字符序列,即StringBuffer是线程安全的,而StringBuilder是非线程安全的。继承关系图如下:

StringBuilder&StringBuffer

CharSequence:是一个接口,CharSequence是char值的可读序列。 该接口提供统一的,只读访问许多不同类型的char序列。 char值代表基本多语言平面(BMP)或代理中的一个字符。 详见Unicode Character Representation 。此接口不会完善equals和hashCode方法。 因此,比较两个对象实现CharSequence其结果是,在一般情况下,不确定的。 每个对象可以由不同的类实现,并且不能保证每个类都能够测试其与另一个类相同。 因此,使用任意的CharSequence实例作为集合中的元素或映射中的键是不合适的。

Appendable:也是一个接口,能够被添加 char 序列和值的对象。如果某个类的实例打算接收取自 Formatter 的格式化输出,那么该类必须实现 Appendable 接口。要添加的字符应该是有效的 Unicode 字符,正如 Unicode Character Representation 中描述的那样。注意,增补字符可能由多个 16 位 char 值组成。Appendable 对于多线程访问而言没必要是安全的。线程安全由扩展和实现此接口的类负责。由于此接口可能由具有不同的错误处理风格的现有类实现,所以无法保证错误不会传播给调用者。

StringBuffer:线程安全的可变的字符序列, 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容 。 字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生 。

StringBuilder:一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。 此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。 在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快.

关于StringBuffer和StringBuilder的线程安全问题,可以分别查看类里面的方法,其中StringBuffer里面的方法都是用synchronized关键字进行了修饰,所以是线程安全的。也可以通过下面进行测试

启动10个线程,对字符串进行追加

  public static void main(String[] args) throws Exception{
        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0;i

最终的运行结果:StringBuilder长度:94301,这个与期望的值不太一样。

同理测试StringBuffer就不会存在上述的问题

public static void main(String[] args) throws Exception{
    StringBuffer stringBuffer=new StringBuffer();
    for(int i=0;i

关于Stringbuilder为什么会出现94301,而不是100000,可以通过源码分析得出

当StringBuilder调用append(“a”)这个方法时,调用如下:

 @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

最终调用的是父类的方法

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;
}

而在执行count+=len;这个动作时,如果存在多线程的情况下,就有可能导致 线程安全问题,所以才会出现上述的情况。

Original: https://www.cnblogs.com/haizhilangzi/p/12749508.html
Author: 海之浪子
Title: StringBuilder&StringBuffer

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581082/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    Java 2023年6月16日
    067
  • 深入理解Java虚拟机之自己编译JDK

    题外话 最近在阅读《深入理解Java虚拟机》,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考! 前置准备 平台及工具: W…

    Java 2023年6月6日
    081
  • 花生壳内网穿透

    Original: https://www.cnblogs.com/weiapro/p/7688796.htmlAuthor: 天涯越野Title: 花生壳内网穿透

    Java 2023年6月13日
    059
  • 重学Java(二):对象无处不在

    本系列文章内容来自于《Thinking in Java》作者的最新续作《On Java》基础卷,作者根据最新 Java 8、11、17的内容,重讲了Java的编程思想,值得初学者阅…

    Java 2023年6月7日
    072
  • MySQL查询生成行号

    Oracle中可以使用ROWNUM,MYSQL无该关键词,需要使用以下形式: SELECT @rowNum:=@rowNum + 1 AS ‘行号’, a.X1, a.X2, a….

    Java 2023年6月5日
    058
  • 多线程与高并发(二)—— Synchronized 加锁解锁流程

    前言 上篇主要对 Synchronized 的锁实现原理 Monitor 机制进行了介绍,由于 Monitor 基于操作系统调用,上下文切换导致开销大,在竞争不激烈时性能不算很好,…

    Java 2023年6月9日
    082
  • HTTP长连接–Keep-Alive

    一、 HTTP/1.0 HTTP1.0版本的Keep-alive并不像HTTP1.1那样是默认发送的,所以要想连接得到保持,必须手动配置发送connection:keep-aliv…

    Java 2023年6月13日
    063
  • SpringBoot学习(九)使用JTA的分布式事务、Hazelcast、Quartz调度器和任务执行和调度

    一、使用JTA的分布式事务 通过使用Atomikos或Bitronix嵌入式事务管理器,Spring Boot支持跨多个XA资源的分布式JTA事务。在部署到适当的Java EE应用…

    Java 2023年5月30日
    064
  • VUE下载文件,下载后台返回的response

    Js文件中 import request from "../utils/request-flask-filedown"; //切图下载 export funct…

    Java 2023年6月13日
    061
  • MyBatis的配置

    MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具…

    Java 2023年5月30日
    081
  • jooq简单使用

    *DSLContext首先简单的配置文件 <?xml version="1.0" encoding="UTF-8" standalon…

    Java 2023年6月15日
    067
  • 77 ~And, two stars meet again~ RC汉化补丁[BUG修正]

    【遊戲名稱/Name】:77 ~And, two stars meet again~ 【遊戲廠商/Company】:Whirlpoor 【發售日期/Sale date】:2009/…

    Java 2023年5月29日
    077
  • 日程功能模块【从建模到代码实现】UML + JavaFX

    结合 uml 所学和 Javafx 从建模到实现一个子功能模块 —— 日程管理。新手上路,类图到代码实现的过程还是很曲折但所幸收获颇丰,记录一下学习心得。 日程功能模块 最后成果 …

    Java 2023年6月5日
    085
  • 006-博学谷-年度钻石C++/C-Unix/Linux(5)

    远程操作 5.1 SSH介绍 SSH为Secure Shell的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输…

    Java 2023年6月7日
    074
  • Java面向对象

    面向对象 1.面向对象的概念 面向对象和面向过程的区别 面向过程: 将问题分解成步骤,然后按照步骤实现函数,执行时一次调用函数。 数据和对数据的操作是分离的。 面向对象: 将问题分…

    Java 2023年6月9日
    078
  • 为什么用Redis做排行榜?

    数据结构方面:Redis的sorted set结构用来排名很方便,谁得分高谁排名往上。 排行榜是时限性业务。具有周期性。超出时间,自动删除。Redis的超时设置很好实现。 排行榜是…

    Java 2023年6月15日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球