StringBuffer解析

news/2024/12/22 0:59:27/

StringBuffer是可变的字符序列,当一个StringBuffer被创建以后,通过StringBuffer提供append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer的直接父类是AbstractStringBuilder,实现了Serializable即StringBuffer的对象可以串行化,在父类中AbstractStringBuilder有属性char[] value,不是final,该value数组存放字符串内容,存放在堆中,StringBuffer是一个final 类,不能被继承,因为StringBuffer字符内容是存在char[] value所以在变化(增加/删除) 时,不用每次都更换地址(不用创建新对象)效率高于String。

/*** @Author * StringBuffer**/
public class StringBuffer01 {public static void main(String[] args) {//创建一个大小为16的char[],用于存放字符内容StringBuffer stringBuffer01 = new StringBuffer();//2.通过构造器指定char[]的大小StringBuffer stringBuffer02 = new StringBuffer(100);//通过给一个String 创建 StringBuffer,char[] 大小就是str.length + 16StringBuffer stringBuffer03 = new StringBuffer("hello");String str = null;StringBuffer sb = new StringBuffer();sb.append(str);System.out.println(sb.length());//4}
}

String str = null是成立的,但是在StringBuffer的源码中append()方法:

@Overridepublic synchronized StringBuffer append(Object obj) {toStringCache = null;super.append(String.valueOf(obj));return this;}

从源码中看出StringBuffer中的append方法调用了父类的append方法,进父类AbstractStringBuilder查看父类的append方法,源码如下:

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

str为空时,调用appendNull()方法,追进appendNull()方法

  private AbstractStringBuilder appendNull() {int c = count;ensureCapacityInternal(c + 4);final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;}

把空对象转化为字符数组’null’,故最后输出的结果应该为4。


http://www.ppmy.cn/news/1231416.html

相关文章

代码随想录算法训练营|五十七天

每日温度 739. 每日温度 - 力扣(LeetCode) 压入栈时的元素和栈内的元素比较,有三个情况,栈内元素大于等于压入栈时的元素,此时压入栈内;如果小于压入栈内的元素,先记录result,再在…

npm ERR! Cannot read properties of null (reading ‘pickAlgorithm‘)

node版本问题,版本太高,降低就行,我将到v16.14.1就行了

AcWing102. 最佳牛围栏

题目 农夫约翰的农场由 N N N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区…

HarmonyOS ArkTS开发语言介绍(三)

1 引言 Mozilla创造了JS,Microsoft创建了TS,Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力,到具备类型系统的高效工程开发能力,再到融合声明式UI、多维状态管理等丰富的应用开发能力,共同组成了相关的演进脉…

基于nodejs学校宿舍管理系统-计算机毕设 附源码45118

nodejs学校宿舍管理系统 摘要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对学校宿舍管理系统等…

机器学习算法——集成学习

目录 1. Bagging1.1 工作流程1.2 代码实践 2. 随机森林2.1 工作流程2.2 代码实践 3. Adaboost3.1 工作流程3.2 样本权值的更新策略3.3 代码实践 4. Stacking4.1 代码实践 5. Voting5.1 代码实践 6. 集成学习分类 1. Bagging Bagging(bootstrap aggregating&#xf…

Python编程技巧 – 使用字典

Python编程技巧 – 使用字典 Python Programming Skills – Using Dictionary Dictionary, 即字典,这是Python语言的一种重要的数据结构;Python字典是以键(key)值(value)对为元素,来存储数据的集合。 前文提到Python列…

每日汇评:美日在两个月低点附近似乎较为脆弱,熊市可能会在FOMC会议纪要公布前暂停

美元/日元跌至两个月低点,并受到多种因素的压力; 美联储鸽派预期和美国债券收益率下降继续令美元承压; 美日利差缩小以及日本央行政策转变的押注提振了日元; 美元/日元货币对在周二持续第四天承受着沉重的卖压,同时也标…