• StringBuffer解析


    StringBuffer是可变的字符序列,当一个StringBuffer被创建以后,通过StringBuffer提供append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer的直接父类是AbstractStringBuilder,实现了Serializable即StringBuffer的对象可以串行化,在父类中AbstractStringBuilder有属性char[] value,不是final,该value数组存放字符串内容,存放在堆中,StringBuffer是一个final 类,不能被继承,因为StringBuffer字符内容是存在char[] value所以在变化(增加/删除) 时,不用每次都更换地址(不用创建新对象)效率高于String。

    1. /**
    2. * @Author
    3. * StringBuffer
    4. **/
    5. public class StringBuffer01 {
    6. public static void main(String[] args) {
    7. //创建一个大小为16的char[],用于存放字符内容
    8. StringBuffer stringBuffer01 = new StringBuffer();
    9. //2.通过构造器指定char[]的大小
    10. StringBuffer stringBuffer02 = new StringBuffer(100);
    11. //通过给一个String 创建 StringBuffer,char[] 大小就是str.length + 16
    12. StringBuffer stringBuffer03 = new StringBuffer("hello");
    13. String str = null;
    14. StringBuffer sb = new StringBuffer();
    15. sb.append(str);
    16. System.out.println(sb.length());//4
    17. }
    18. }

    String str = null是成立的,但是在StringBuffer的源码中append()方法:

    1. @Override
    2. public synchronized StringBuffer append(Object obj) {
    3. toStringCache = null;
    4. super.append(String.valueOf(obj));
    5. return this;
    6. }

    从源码中看出StringBuffer中的append方法调用了父类的append方法,进父类AbstractStringBuilder查看父类的append方法,源码如下:

    1. public AbstractStringBuilder append(String str) {
    2. if (str == null)
    3. return appendNull();
    4. int len = str.length();
    5. ensureCapacityInternal(count + len);
    6. str.getChars(0, len, value, count);
    7. count += len;
    8. return this;
    9. }

    str为空时,调用appendNull()方法,追进appendNull()方法

    1. private AbstractStringBuilder appendNull() {
    2. int c = count;
    3. ensureCapacityInternal(c + 4);
    4. final char[] value = this.value;
    5. value[c++] = 'n';
    6. value[c++] = 'u';
    7. value[c++] = 'l';
    8. value[c++] = 'l';
    9. count = c;
    10. return this;
    11. }

    把空对象转化为字符数组’null’,故最后输出的结果应该为4。

  • 相关阅读:
    hive从入门到放弃(六)——常用文件存储格式
    SQL语句操作数据库
    QT+OSG/osgEarth编译之二十八:cairo+Qt编译(一套代码、一套框架,跨平台编译,版本:cairo-1.16.0)
    Impala计算日期差datediff
    B_QuRT_User_Guide(28)
    Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取
    OrCAD原理图关联Allegro PCB交互设计设置的方法
    mysql 主从复制
    3种等待方式,让你学会Selenium设置自动化等待测试脚本!
    “农场”技术栈是什么?浅聊FARM Stack
  • 原文地址:https://blog.csdn.net/xing_jian1/article/details/134538821