StringBuffer 和 StringBuilder 源码研究

String/StringBuilder/ToString()底层代码解析( JAVA / C# ) 本章笔记直接记录的string、StringBuilder内存存储原理,并没有大幅度、重点的去介绍堆、栈、常量池的相关底层实现原理。所以,为了帮助大家更好的去理解,可以在阅读本文章前去了解堆、栈、常量池之间的基础关系,对以下的阅读有很大的帮助。 ToString底层代码解析(C#/JAVA)——分别浅谈 C# / JAVA 底层实现代码与区别... 阅读详情

一. 前言

StringBuffer 和 StringBuilder的底层都是使用数组存储

结构图:
在这里插入图片描述

二. 区别

  1. 他们两个的区别主要就在于 StringBuffer 的方法上基本都加了 synchronized 关键字,保证了线程安全,当然也降低了性能.
    而 StringBuilder 的方法没有加synchronized 关键字.

  2. StringBuffer 会缓存最后一次使用 toString 方法的返回值

  3. StringBuffer 会重写一些父类方法,实现为 super.xx() 直接调用父类方法.但是重写的方法加上了 synchronized 关键字.也就保证了在调用了父类的方法时也是线程安全的.

    其他方面基本一直.来让我往下观看相同的地方

二. 构造器

有三种构造器:

  1. 无参数构造器
  2. 有初始字符串构造器
  3. 有初始容量大小构造器

在 new StringBuffer () 时,创建的初始数组在没有设置大小时,为 16, 如果设置了初始字符串,则会在字符串的长度加上 16

StringBuffer 对象有两个属性(准确说是父类 AbstractStringBuilder 的属性).char[] value; 和 int count;;前者是对象底层的数组(包含附加的缓冲空间),后者是数组中的字符数量; value > count

四. append 方法

  1. 在每次调用时会清除最后一次调用 toString() 时缓存的结果(StringBuffer 专属)
  2. 使用 append 方法时,如果传入的对象为 null, 则会变成添加字符串 'null’的操作
  3. 在添加元素前会判断,添加对象的长度和 count 相加是否小于 value,length .如果不是则扩充
  4. 将添加对象的字符添加到 value 中,具体调用的是本地方法,将添加对象的字符数组拷贝到 value 数组的指定位置
  5. 将 count 更改为加上添加对象的长度的值

五. StringBuffer 和 StringBuilder 的扩充

  1. 先将 value.length 进行位移运算向左移动一位,然后 +2
  2. 判断 value.length 位移后的长度和 count + 增加新元素的长度大小.如果小于 count + 增加新元素的长度大小,则数组长度设置为 count + 增加新元素的长度大小,
  3. 判断长度是否大于 MAX_ARRAY_SIZE ( 值为 Integer.MAX_VALUE - 8 )或长度为负数 (即溢出) 都会判断是否大于Integer.MAX_VALUE 如果大于则报错,小于则判断是否大于 MAX_ARRAY_SIZE ,如果大于则扩充到该值,如果小于则为 MAX_ARRAY_SIZE
源码分析篇之String源码分析一    一直以来都听到很多周围的同事说看源码,看源码,自己也在不知不觉中收到影响,加入了看源码的行列。但是初看源码我是真的不知道要怎么看,该看些什么。但是最近通过看别人的博客,看些书,渐渐的就发现了一些不一样的东西,这只是自己的理解,大神路过就好,莫喷。    java基本数据类型有8个,byte,short,int,long,float,double,char,boolean这8个,String... 阅读详情

相关推荐

2018汇总JDK源码篇

  从JDK源码看String(上) 从JDK源码看String(下) 从JDK源码看StringBuffer 从JDK源码看StringBuilder 从JDK源码看Java域名解析 JVM的ServerSocket是怎么实现的(上) JVM的ServerSocket是怎么实现的(下)   从JDK源码角度看Short 从JDK源码角度看Integer 从JDK源码角度看L...

seaboat——a free boat on the sea.(公众号:远洋号) 1267

java学习---位移、单例、StringBuffer等相关知识点

左移和右移 左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0 右移:根据一个整数的二进制表达,将其每一位都向右移动 public static void main(String[] args) { byte i = 11; System.out.println(Integer.toBinaryString(i)); System.out.println(i<&...

xioaf12的专栏 201

C#文章加空格源码 StringBuilder类

有选中部分给选中部分加空格 没有选中部分给整篇文章加空格

C# StringBuilder源码分析

`StringBuilder` 是 .NET 中对字符串拼接进行优化的经典案例。它通过巧妙地结合字符数组和链表结构,在保证灵活性的同时,也兼顾了性能。

yasin的博客 1290

StringBuilder字符串生成器(含源码VS2010)

StringBuilder 字符串生成器 举例说明: SELECT * FROM dbo.Pub_User WHERE ID = 1001 以上这段Sql语句,利用此工具,一键生成以下StringBuilder字符串变量,支持翻转生成,内含VS2010源码,是.Net程序员必备工具 sb.AppendLine("SELECT *"); sb.AppendLine("FROM dbo.Pub_User"); sb.AppendLine("WHERE ID = 1001");

StringBuilder拓展方法示例源码2012530

StringBuilder拓展方法示例源码 项目描述 源码演示了手动给StringBuilder添加拓展方法IndexOf string的一些方法StringBuilder没有,我们可以灵活的给他 拓展一下。把自己需要的方法添加上。以后在项目里直接引用一下来自51ASPX 就可以了。知识是一点一点积累的。 欢迎感兴趣的用户下载学习。

String,StringBuilder,StringBuffer源码分析

String 长度大小不可变StringBuffer 和 StringBuilder 长度可变StringBuffer 线程安全 StringBuilder 线程不安全因此:String:适用于少量的字符串操作的情况StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

顶峰 789

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4481

浅谈stringBuilder.ToString()方法底层原理代码解析(C#/JAVA)

ToString方法浅谈一、什么是单向链表?二、ToString()底层区别(C#/Java)C#Java两者区别二、走进底层代码 — 场景回顾小结 一、什么是单向链表? 首先我们要知道,三个StringBuilder的关系是单向链表,那么什么是单向链表呢? 链表是一种特殊的数据结构,能够动态的存储一种结构类型数据。 该结构由节点组成。每个节点包含两个部分数据: 第一部分(尾节点):节点本身的数据 第二部分(头节点):指向下一个节点的指针(整个stringBuilder对象的地址 单向链表就是C# 的

weixin_46484674的博客 7952

【LCMM实战指南】从增长混合模型到潜在类别轨迹分析的纵向数据建模

本文深入解析了LCMM(潜在类别混合模型)在纵向数据建模中的应用,对比了LCGA与GMM的核心差异与选择策略。通过R语言lcmm包的实战演练,详细展示了从数据模拟、模型拟合、类别数选择到结果解读的全流程,为识别数据中不同的发展轨迹亚型提供了系统指南。

weixin_29070861的博客 380

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 245

Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究

我们可以看到,无论是StringBuffer或者是StringBuilder都是继承了这个类,所我们先研究这个类里面共有4个属性value:存储字符串的(字符串底层是字符数组,默认容量为16)count:记录字符数组的长度,这样做的好处就是让返回字符数组长度的时间复杂度为1,而不用去遍历数组MAX_ARRAY_SIZE:字符数组允许的最大长度,为( 2 31 − 8 2^{31}-8 231−8),从注释上就可以看到,这个变量并不是必要的,只不过是避免大数组会导致内存溢出(超出虚拟机的限制)。

m0_60721649的博客 699

Windows 下安装 ros2 的超详细教程

Windows11 ROS安装

2401_83363439的博客 3318

JDK8源码研究(二):AbstractStringBuilder StringBuilder StringBuffer

首先来看AbstractStringBuilder,实现了CharSequence,该接口也是String的接口,定义了字符串的方法,还有Appendable接口,该接口定义了append方法以及几个append方法的重载。再来看AbstractStringBuilder类的私有属性,和String类比较相近,比String少了个hash属性,AbstractStringBuilder类没有重...

qq_34684394的博客 434

伺服电机开发实战指南

伺服电机作为工业自动化的核心部件,正经历前所未有的技术革新。本文从基础原理出发,详细介绍了伺服电机的分类、工作原理和特性,分析了伺服电机系统组成与核心部件,探讨了企业级开发技术,包括控制算法、通信协议和故障诊断等高级功能,并提供了实战案例分析,从行业应用到具体开发步骤,展示了伺服电机的工程实现。通过深入理解伺服电机的原理、掌握开发技术、学习应用案例,可以实现伺服系统的高性能开发与应用。

全栈 1676

永磁同步电机FOC控制实战:如何用线性死区补偿解决低速抖动问题(附Matlab仿真代码)

本文详细介绍了永磁同步电机FOC控制中线性死区补偿技术的工程实现方法,有效解决低速抖动问题。通过Matlab/Simulink仿真验证,该方案可将转矩脉动降低70%以上,显著提升系统稳定性。文章包含完整的数学模型构建、Simulink实现步骤及参数整定技巧,为工程师提供实用解决方案。

weixin_30872499的博客 154

java基础一(List/Set/Map/String/StringBuilder/StringBuffer)

1.有时间大家可以研究下JDK的源码,现在只是先大概总结下。 2.List(①有序②可重复) ArrayList(①底层数组②线程不安全③注意remove有坑) LinkedList(①底层是双向链表②线程不安全全) Vector(①底层是数组②通过synchronized保证线程安全) 3.Set(不重复) HashSet(①无序②不重复③线程不安全) LinkedHashSet(①...

如果我爱自己我就会日出而坐,日落而息 410

【UE5】映射方式:动作映射(Action Mappings) 与 轴映射(Axis Mappings)

链接:https://pan.baidu.com/s/1nQHvZXC4BDsfbFWDYZqEfA?按下键盘A键,不要抬起,屏幕左上角打印了一次。(和Unity中的轴映射机制类似)下面我们通过测试更直观的了解一下这。抬起键盘A键,屏幕左上角打印了一次。项目资源文末百度网盘自取。再添加一个按键,选择键盘。键,缩放值设置为 2.0。,框选所有测试节点,按下。的情况下,屏幕一直打印。

weixin_64072619的博客 3501

StringBuilder和StringBuffer的区别

StringBuilder和StringBuffer的区别在哪里? 当接触这个问题的时候,我们可能第一反应就是,StringBuilder是线程不安全的,StringBuffer是线程安全的 为什么StringBuilder是线程不安全,StringBuffer是线程安全? 针对这个问题,大部分的人可能就无言以对了,我们只知道StringBuilder是线程不安全的,StringBuffer...

半生苦涩半生酸的博客 3万+

详解FreeRTOS:FreeRTOSConfig.h系统配置文件(拓展篇—1)

FreeRTOS的系统配置文件为FreeRTOSConfig.h,在配置文件中可以完成FreeRTOS的裁剪和配置,这是非常重要的一个文件,本篇博文就来讲解这个文件。

不脱发的程序猿 1546

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

String StringBuilder StringBuffer区别以及源码分析

1. Spring/SpringBuilder/SpringBuffer 区别 1.1 String String 对象一旦创建之后就是不可变的,不可变的! 问题:既然String 对象是不可变的,那么其包含的常用修改值的方法是如何实现的呢? Demo substring(int,int) 字符串截取 split(String,int) 字符串分割 toLowerCase() 字符串所有字母小写 ... 其实,这些方法底层都是通过重新创建一个String 对象来接收变动后的字

兴趣使然的草帽路飞 9839

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从源码深入分析Java中 StringBuffer和StringBuilder的区别

从源码深入分析Java中 StringBuffer和StringBuilder的区别? StringBuffer 与 StringBuilder 中的方法和功能完全是等价的。 StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。 在单线程程序下,StringBuilder...

精◈彩◈猿◈笔◈记 1910

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

String、StringBuilder 和 StringBuffer 详解

本篇文章主要描述了 String 、StringBuilder 和 StringBuffer 的主要特性,String、StringBuilder 和 StringBuffer 的底层构造是怎样的,StringBuilder 和 StringBuffer 的扩容特性等。

zrulin的博客 4423

Java基础——StringBuilder和StringBuffer

此文主要针对StringBuffer和StringBuilder做一些解读。

WanguideShenghuo的博客 2830

StringBuilder与StringBuffer详解

提示:以下是本篇文章正文内容,下面案例可供参考。

qq_44009585的博客 3963
上一篇: Spring IOC 源码解析(八) Bean 的创建
下一篇: Spring IOC 源码解析(九) ApplicationContext refresh()
Carey丶zsh
博客等级 码龄10年 15粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值