zoukankan      html  css  js  c++  java
  • java.lang.StringBuilder和java.lang.StringBuffer (JDK1.8)

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

    1 char[] value;
    2 int count;

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

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

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

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

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

    1 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类的方法。

    1 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方法。难度都不大,这里不赘述了~~

  • 相关阅读:
    极客时间课程《数据结构与算法之美》笔记09
    Java 学习笔记02
    极客时间课程《数据结构与算法之美》笔记05
    极客时间课程《数据结构与算法之美》笔记04
    极客时间课程《数据结构与算法之美》笔记03
    极客时间课程《数据结构与算法之美》笔记02
    极客时间课程《数据结构与算法之美》01
    spring data jpa 通过对象传参
    生成流水号
    Java 为实体类动态添加属性
  • 原文地址:https://www.cnblogs.com/snowater/p/7652558.html
Copyright © 2011-2022 走看看