StringBuilder/StringBuffer源码阅读笔记

举报
三分恶 发表于 2021/04/27 23:32:40 2021/04/27
【摘要】 在 Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续学习这两个类的源码。 本文基于jdk1.8。 StringBuilder/StringBuffer继承关系 StringBuilder、StringBuild...

Java String类源码阅读笔记 里学习了String类的源码,StringBuilder、StringBuffer是经常拿来和String类做对比的两个类,可谓是“爱恨纠缠” ,这里我们继续学习这两个类的源码。

本文基于jdk1.8。


StringBuilder/StringBuffer继承关系

StringBuilder、StringBuilder具有相同的继承关系,都继承自AbstractStringBuilder类,实现了CharSequence接
口。

StringBuilder继承关系

在这里插入图片描述

StringBuffer继承关系

在这里插入图片描述


AbstractStringBuilder

这里我们先看一下AbstractStringBuilder这个类,StringBuilder、StringBuffer中的很多方法都是调用它们的父类。

属性

//用作字符存储的数组
char[] value;
//字符数组的字符个数
int count;

  
 
  • 1
  • 2
  • 3
  • 4

构造方法

  • 无参
 AbstractStringBuilder() { }

  
 
  • 1
  • 2
  • 有参
  //为字符数组指定容量
 AbstractStringBuilder(int capacity) { value = new char[capacity]; }

  
 
  • 1
  • 2
  • 3
  • 4

length()

  //返回字符个数 @Override public int length() { return count; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

capacity()

 //返回AbstractStringBuilder的容量(数组的容量) public int capacity() { return value.length; }

  
 
  • 1
  • 2
  • 3
  • 4

扩容

   /** *  私有方法,扩容,扩大value数组容量,并拷贝数组元素 */ private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } } //调用私有扩容方法 public void ensureCapacity(int minimumCapacity) { if (minimumCapacity > 0) ensureCapacityInternal(minimumCapacity); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

拼接

   /** * 私有方法,追加字符串 */ public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); //将value数组扩容 ensureCapacityInternal(count + len); //调用Stirng类的getChars方法将str追加到末尾 str.getChars(0, len, value, count); count += len; //返回自身 return this; } //调用私有扩容方法 public AbstractStringBuilder append(Object obj) { return append(String.valueOf(obj)); } 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

除了拼接字符串,AbstractStringBuilder还实现了拼接字符数组,基本数据类型等。


StringBuilder

在StringBuilder中,绝大部分的方法都是直接调用父类AbstractStringBuilder类的方法。

例如:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

StringBuffer

属性

 // toString返回的最后一个值的缓存。 每当修改StringBuffer时清除。
 private transient char[] toStringCache;

  
 
  • 1
  • 2

方法

和StringBuilder类似,StringBuffer大部分方法也都是直接调用父类AbstractStringBuilder类的方法的方法。

不同的是,StringBuffer是线程安全的。是因为 StringBuffer 类的 大部分方法都被 synchronized 修饰

例如:

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6



参考:

【1】:String源码分析
【2】:Java StringBuilder和StringBuffer源码分析

文章来源: blog.csdn.net,作者:三分恶,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/sinat_40770656/article/details/108803032

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。