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。。。。。。
    我绷不住了

  • 相关阅读:
    装饰器 转载自 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
    no_merge hint
    优化实例- not use hash to avoid temp space issue
    明日计划
    优化实例- not in 和 not exists
    insert into varchar2(8000)
    图像的批处理
    图像数据类型及颜色空间转换
    图像的读取,显示与保存(基于skimage模块)
    图像直方图
  • 原文地址:https://www.cnblogs.com/sariseBlog/p/14965059.html
Copyright © 2011-2022 走看看