这两个类都是继承自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. net user命令详解

    net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user: ...

  2. socket.io 入门篇(二)

    本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...

  3. 基于docker+reveal.js搭建一个属于自己的在线ppt网站

    前言 最近热衷于Docker,由于这段时间使用Docker来折腾自己的服务器,越来越感觉这是一种及其被应该推广的技术,因此想在公司内部也做一次技术分享.当然,如果只是做的PPT,我就不写这文章了.既然 ...

  4. 《java.util.concurrent 包源码阅读》12 线程池系列之ThreadPoolExecutor 第二部分

    接着说worker线程是如何工作的.ThreadPoolExecutor有一个成员类叫Worker,所起到的作用就是线程池worker线程的作用. private final class Worker ...

  5. JAVA 中LinkedHashMap要点记录

    JAVA 中LinkedHashMap要点记录 构造函数中可能出现的几个参数说明如下: 1.initialCapacity 初始容量大小,使用无参构造方法时,此值默认是16 2.loadFactor ...

  6. js中一些注意点 ps不断更新中....

    nextSibling 和 nextElementSibling 的区别 (previousSibling 和 previousElementSibling ) nextSibling 在IE8及以下 ...

  7. 51Nod--1018排序

    1018 排序 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出N个整数,对着N个整数进行排序 Input 第1行:整数的数量N(1 <= N  ...

  8. lnmp1.3 配置pathinfo---thinkphp3.2 亲测有效

    lnmp1.3环境下配置pathinfo模式试了很多方法,都以失败告终,博主被这个问题困扰了很久,终于解决了!现记录如下: 1.打开php.ini 通常该文件在 /usr/local/php/etc/ ...

  9. svn up出现类似svn: Error converting entry in directory '.' to UTF-8问题解决

    执行svn up命令报错如下 # svn up svn: Error converting entry svn: Valid UTF- data (hex:) followed by invalid ...

  10. java进阶书籍

    1.<深入理解Java虚拟机:JVM高级特性与最佳实践> 2.<HotSpot实战> 3.<Java并发编程实战> Brian Goetz 4. <Java多 ...