• StringBuilder和StringBuffer


    StringBuffer和StringBuilder ,使用append()追加字符串的时候,都是同一个对象,里面的源代码如下:

    StringBuffer 源代码如下文:

     @Override
        public synchronized StringBuffer append(String str) {
            toStringCache = null;
            super.append(str);
            return this;
        }

    StringBuilder 源代码如下:

     @Override
        public StringBuilder append(String str) {
            super.append(str);
            return this;
        }

    从上面的源代码可以看出:StringBuffer 是线程安全的,StringBuilder 是线程不安全的。而它们都共同调用 super.append(str),源代码如下:

     public AbstractStringBuilder append(String str) {
            if (str == null)
                return appendNull();
            int len = str.length();
            ensureCapacityInternal(count + len);
            str.getChars(0, len, value, count);
            count += len;
            return this;
        }

    这里面要注意的一点的是,这个 ensureCapacityInternal(count + len),其中的源代码如下:

     private void ensureCapacityInternal(int minimumCapacity) {
            // overflow-conscious code
            if (minimumCapacity - value.length > 0) {
                value = Arrays.copyOf(value,
                        newCapacity(minimumCapacity));
            }
        }

    这里的value,是一个char[]。从这里可以看出

    1、如果value 这个char[]容量不足,则会新建一个char[]。if (minimumCapacity - value.length > 0) 这个代码的写法有点难懂,写成:if (minimumCapacity >value.length) 会更容易懂。

    2、如果value的char[]容量足够,则继续使用这个char[]。 

    ----------------------------------------------------------------------------------

    这里也可以看出,为什么少量的字符串操作是使用String,而大量的字符串追加是使用StringBuffer 和StringBuilder 了

  • 相关阅读:
    C 栈和堆的区别
    ubuntu 12.10 禁用触摸板
    完美解决 linux sublime 中文无法输入
    gdb 断点调试C程序
    归并排序
    算法效率表示
    sublime -text 删除已安装插件
    MSSQL数据库表索引碎片整理优化性能
    Rdlc报表出现空白页解决方法
    RDLC报表:每页显示N条记录
  • 原文地址:https://www.cnblogs.com/drafire/p/10646856.html
Copyright © 2020-2023  润新知