`
leonzhx
  • 浏览: 793695 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读 AbstractStringBuilder/StringBuilder/StringBuffer 源代码

阅读更多

1.  StringBuilder和StringBuffer都继承了AbstractStringBuilder。它们都是由可变的char[] value和int count组成。而AbstractStringBuilder中唯一的抽象方法是toString()。StringBuffer中所有的method都是synchronized的。

 

2.  StringBuilder和StringBuffer无参数的构造函数会分配大小为16的char array,而参数为String的构造函数也会比传入的String多分配16个char。

 

3.  AbstractStringBuilder.ensureCapacity(int minimumCapacity), 如果 minimumCapacity 大于length会取 minimumCapacity和 length*2 + 2中较大者作为新分配空间char array的大小。这个方法在char array扩展时都会被调用。

 

4.  trimToSize() 将char array缩小到count大小的空间。

 

5.  setLength(int newLength) 将 count变为newLength。如果newLength比原来的count大,扩展char array, 大于原来count部分的char用'\u0000' 填充。

 

6.  append(null) 的时候作为 append("null") 处理,与 String.valueOf() 同理。

 

7.  capacity()方法返回 count。

 

8.  System.arraycopy 可以用作在同一个array中移动部分数据,比如: System.arraycopy( array, 5 , array, 6, 10 ) 会将 array中的数据从第5个之后的10个数据往后移一位。

 

9.  reverse()方法是按CodePoint reverse的,但原来的char array中不成对的surrogate pairs,在reverse后很可能成为了成对的surrogate paris。因为不成对的surrogate pair会被当成两个BMP中的char处理。

 

10. StringBuilder 自己定义了 serialize 和 反 serialize方法:

/**
     * Save the state of the <tt>StringBuilder</tt> instance to a stream
     * (that is, serialize it).
     *
     * @serialData the number of characters currently stored in the string
     *             builder (<tt>int</tt>), followed by the characters in the
     *             string builder (<tt>char[]</tt>).   The length of the
     *             <tt>char</tt> array may be greater than the number of
     *             characters currently stored in the string builder, in which
     *             case extra characters are ignored.
     */
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        s.defaultWriteObject();
        s.writeInt(count);
        s.writeObject(value);
    }

    /**
     * readObject is called to restore the state of the StringBuffer from
     * a stream.
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        count = s.readInt();
        value = (char[]) s.readObject();
    }

 

11. StringBuffer 自己写了 serialize 和 反 serialize方法:

 

 /**
     * Serializable fields for StringBuffer.
     *
     * @serialField value  char[]
     *              The backing character array of this StringBuffer.
     * @serialField count int
     *              The number of characters in this StringBuffer.
     * @serialField shared  boolean
     *              A flag indicating whether the backing array is shared.
     *              The value is ignored upon deserialization.
     */
    private static final java.io.ObjectStreamField[] serialPersistentFields =
    {
        new java.io.ObjectStreamField("value", char[].class),
        new java.io.ObjectStreamField("count", Integer.TYPE),
        new java.io.ObjectStreamField("shared", Boolean.TYPE),
    };

    /**
     * readObject is called to restore the state of the StringBuffer from
     * a stream.
     */
    private synchronized void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        java.io.ObjectOutputStream.PutField fields = s.putFields();
        fields.put("value", value);
        fields.put("count", count);
        fields.put("shared", false);
        s.writeFields();
    }

    /**
     * readObject is called to restore the state of the StringBuffer from
     * a stream.
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        java.io.ObjectInputStream.GetField fields = s.readFields();
        value = (char[])fields.get("value", null);
        count = fields.get("count", 0);
    }

 既然读入的时候忽略 shared,为什么还要写入呢?

 

 

0
0
分享到:
评论

相关推荐

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...

    String、StringBuilder、StringBuffer 用法比较

    stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...

    String、StringBuffer与StringBuilder之间区别

     StringBuffer:字符创变量  StringBuilder:字符创变量  从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:

    从源码角度简单看StringBuilder和StringBuffer的异同(全面解析)

    StringBuilder和StringBuffer的异同解析 StringBuilder和StringBuffer是Java中两个常用的字符串处理类,它们都用于字符串的处理和操作,但它们之间存在一些关键的差异。本文将从源码角度对StringBuilder和...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`...理解`String`、`StringBuffer`和`StringBuilder`的区别和使用场合,可以帮助开发者写出更高效、更安全的代码。在实际开发中,应根据项目需求和环境选择合适的字符串处理类。

    String ,StringBuffer与StringBuilder

    String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...

    String、StringBuilder、StringBuffer的区别

    String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...

    StringBuffer、StringBuilder、String

    - **StringBuffer** 和 **StringBuilder** 都是`java.lang`包下的公共类(`public class`),它们都继承自`AbstractStringBuilder`,并实现了`java.io.Serializable`和`CharSequence`接口。这意味着它们都可以序列化,...

    java--面试题大全(附答案

    String和StringBuilder、StringBuffer的区别? 答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是...

    Java StringBuilder和StringBuffer源码分析

    `StringBuilder`和`StringBuffer`是Java中处理字符串拼接的重要工具,它们通过`AbstractStringBuilder`类实现了大部分功能。`StringBuilder`适用于单线程环境,追求性能;`StringBuffer`适用于多线程环境,保证数据...

    StringBuffer & StringBuilder 源码分析.docx

    StringBuffer 和 StringBuilder 是 Java 语言中两个常用的字符串操作类,它们都是 CharSequence 接口的实现类,并且都继承了 AbstractStringBuilder 类。下面是对这两个类的源码分析。 首先,StringBuffer 是线程...

    String,StringBuilder,StringBuffer.xmind

    String,StringBuilder,StringBuffer

    String-StringBuffer-StringBuilder

    总的来说,`String`、`StringBuffer`和`StringBuilder`各有其适用的场合,理解它们之间的差异和特性,能够帮助开发者编写出更加高效、安全的代码。在实际开发中,应根据需求和上下文灵活选择合适的字符串处理类。

    StringBuffer和String_区别

    - 如果程序对性能有较高要求,则应当优先考虑使用 **StringBuilder** 而不是 **StringBuffer**,除非确实需要线程安全。 #### 五、代码示例 下面通过几个具体的示例来进一步说明这些区别: 1. **字符串拼接** ...

    String及StringBuffer和StringBuilder的区别

    String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...

    String、StringBuilder以及StringBuffer的区别

    String、StringBuilder以及StringBuffer的区别

    你知道String、StringBuffer和StringBuilder的区别吗

    总的来说,了解`String`、`StringBuffer`和`StringBuilder`的特性并根据实际情况选择合适的类,对于编写高效、线程安全的Java代码至关重要。在日常开发中,应尽量避免不必要的字符串对象创建,特别是在循环中,合理...

Global site tag (gtag.js) - Google Analytics