这两个类都是继承自AbstractStringBuilder,AbstractStringBuilder有两个成员属性

 char[] value;
int count;

前者用于存储字符串,后者用于统计实际使用了多少位,也就是实际存入字符串长度。当new一个StringBuilder或者StringBuffer的时候,默认capacity为16,也即声明出一个16大小的字符数组,此时count=0,value.length=16。

 public StringBuilder()   // 初始char[]长度为16
public StringBuffer() // 初始char[]长度为16 public StringBuilder(String str) // 初始char[]长度为str.length+16
public StringBuffer(String str) // 初始char[]长度为str.length+16

在StringBuilder中基本上自身并没有重新定义什么方法,都是通过super调用的父类AbstractStringBuilder中定义的方法。

在StringBuffer中情况类似,基本上也没有重新定义什么方法,也都是调用父类AbstractStringBuilder中的方法,不过调用的时候方法都是加上了synchronzied,增加了同步锁保证线程安全。在方法前面加上synchronized作用对象是调用该方法的对象实例。

此外StringBuffer中增加了一个私有成员变量:

 private transient char[] toStringCache

transient短暂的意思,是个关键字,用它声明的实例变量,其值不需要维持,换言之序列化的时候不会参与序列化过程。

    // StringBuilder
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
} // StringBuffer
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}

在toString方法中,StringBuffer是将内容拷贝到toStringCache,然后再构造String。toStringCache在任何修改都会被清空置为null。在字符数组未被修改的情况下,下次再调用toString则可以直接使用缓存去构造字符串了。

下面直接看下AbstractStringBuilder类的方法。

 public void ensureCapacity(int minimumCapacity)

该方法用于扩大value的容量,minimumCapacity如果大于value.length则newCapacity = max{value.length*2 + 2, minimumCapacity},如果newCapcity > MAX_ARRAY_SIZE则最终的capacity = max{minimumCapacity, MAX_ARRAY_SIZE}。其中MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 。

在类中定义了各种append方法,如果append方法的参数为null的时候,append结果是将“null”字符串加到现有字符数组后面,而不是什么都不加。如果append(boolean),则是将“true”或者“false”添加到现有字符数组的最后。

AbstractStringBuilder主要定义的是各种append和insert方法。难度都不大,这里不赘述了~~

java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)的更多相关文章

  1. Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder

    一直以来,都是看到网上说“ StringBuilder是线程不安全的,但运行效率高:StringBuffer 是线程安全的,但运行效率低”,然后默默记住:一个是线程安全.一个线程不安全,但对内在原因并 ...

  2. 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题

    REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...

  3. Java基础知识强化47:StringBuffer类之StringBuffer的三个面试题

    1. 面试题:String,StringBuffer,StringBuilder的区别 ? 答:String是字符串内容不可变的,而StringBuffer和StringBuilder是字符串内容长度 ...

  4. 深入理解String, StringBuffer, StringBuilder的区别(基于JDK1.8)

    String.StringBuffer.StringBuilder都是JAVA中常用的字符串操作类,对于他们的区别大家也都能耳熟能详,但底层到底是怎样实现的呢?今天就再深入分析下这三种字符串操作的区别 ...

  5. StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?

    大家都知道String+String会开销额外的系统资源,粗略的原因是String是不可变类,每一步操作都会返回新的String变量,占用空间及时间. 其实我的理解不是这样的,我们来看看String+ ...

  6. Java-Class-FC:java.lang.StringBuilder

    ylbtech-Java-Class-FC:java.lang.StringBuilder 1.返回顶部   2.返回顶部 1. @Override public String toString() ...

  7. < java.lang >-- StringBuilder字符串缓冲区

    JDK1.5出现StringBuiler:构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候( ...

  8. java.lang.String & java.lang.StringBuilder

    java.lang.String & java.lang.StringBuilder String 成员方法 作用 public charAr(int index) 返回给定位置的代码单元 p ...

  9. Java源码学习 -- java.lang.String

    java.lang.String是使用频率非常高的类.要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的.由java.lang.String,自然联想到java.lang ...

随机推荐

  1. Less的Mixin

    什么是Mixin Less中,允许你将一个类嵌入到另一个类中,被嵌入的类也可以看作变量.换句话说,你可以用一个类定义样式,然后把它当作变量,在另一个类中,只要引用变量的名字,就能使用它的所有属性, L ...

  2. HDU4508--完全背包

    湫湫系列故事--减肥记I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  3. python面向对象其他相关-异常处理-反射

    1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象   2.issubclass(sub, super) 检查sub类是否是 super 类的派生类 n1 = 10 ...

  4. 阿里云服务器部署php的laravel项目,在阿里云买ECS 搭建 Linux+Nginx+Mysql+PHP环境的

    在阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubuntu,所以,以下的配置都是在Ubuntu 14.04稳定支持版的环境中搭建Linux+Nginx+Mysql+PHP环境 ...

  5. Express4.x API (二):Request (译)

    写在前面 最近学习express想要系统的过一遍API,www.expressjs.com是express英文官网(进入www.epxressjs.com.cn发现也是只有前几句话是中文呀~~),所以 ...

  6. C#中级-从零打造基于Socket在线升级模块

    一.前言       前段时间一直在折腾基于Socket的产品在线升级模块.之前我曾写过基于.Net Remoting的.基于WCF的在线升级功能,由于并发量较小及当时代码经验的不足一直没有实际应用. ...

  7. Windows和Linux环境下搭建SVN服务器

    --------------------------Windows下搭建SVN服务器----------------------------- 一.安装SVN服务端 软件包Setup-Subversi ...

  8. Linux性能及调优指南(翻译)之Linux进程管理

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

  9. x86 处理器开机顺序

    无论是千万行的linux ,还是百万行的uefi ,或者百十行的app, 它都有一个主线.应用程序是main() 函数里面全部函数运行完,程序结束.这里main() 做为程序的起点,uefi 能够觉得 ...

  10. Swift 是猴还是猿?

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:段义鹏 导语 Swift和Objective-C是目前开发 Apple App的两门主要语言.Swift自2014年发布到目前为止其行业 ...