zoukankan      html  css  js  c++  java
  • JDK源码笔记05 StringBuffer、StringBuilder

    sth before start

    接下来会看StringBuffer、StringBuilder、StringJoiner。其实我感觉这几个类的实现原理应该是不难的,字符串拼接无非就是字符数组的操作,然后调用String的构造函数返回嘛。不过我印象里这些类的效率还是有差别的,有点好奇具体有什么差别。

    StringBuffer说明

    1. 线程安全,方法都是同步的(synchronized)
    2. 可变的字符数组段(sequence of characters)
    3. 他的操作虽然是线程安全的,但是如果传入的原数据(source sequence)是多个线程共享的,那么为了保证线程安全,执行方法的时候也需要获得锁来保证线程安全
    4. 自动扩容
    5. 除法特殊说明,传入空指针会抛出空指针异常
    6. StringBuilder更快,因为他不需要同步
    7. 实现了Comparable,但是没有重写equals,要是用StringBuffer作为SortedMap的key时要注意

    属性

    private transient String toStringCache;
    //缓存toString的返回值
    //transient表示序列化的时候不会被序列化
    //调用insert或其他会改变字符串的方法的时候会设置成空
    

    方法

    然后其实方法里都是调用了父类AbstractStringBuilder的方法,append之类的方法其实都是在这个类里实现的。StringBuffer和StringBuilder只是一个包装类。

    构造函数

    1. public StringBuffer() {super(16);}
      创建容量为16的StringBuffer
    2. public StringBuffer(int capacity)
    3. public StringBuffer(String str)
      根据str的属性创建新的byte[],然后调用append进行初始化

    append(str)

    1. 查看编码,看看需不需要从Latin1改成UTF16
    2. 看看容量够不够,不够就扩容
    3. 调用String的getBytes,将str的内容拷贝进现在的value里

    其他方法也都是大同小异的字符串操作

    比较函数

    • 0 :相同
    • 正数:调用方字典序前
    • 负数:调用方字典序后

    关于同步

    其实就是在所有的方法头都用上了synchronized。。。。。。
    我绷不住了

  • 相关阅读:
    SQL Service Database BACKUP & RESTORE
    vb.net 写入文件同步锁
    ActiveXObject Word.Application 打印小票
    jquery 计算输入的文本的utf-8字节长度
    sql 随笔 2015-08-07
    Android Calander Event
    Html 全屏切换效果
    C#中ref和out关键字的应用以及区别
    Angular安装、卸载 (高版本会导致component.html页面空白)
    bootstrap导航栏(navbar)下拉框无法展开
  • 原文地址:https://www.cnblogs.com/sariseBlog/p/14965059.html
Copyright © 2011-2022 走看看