zoukankan      html  css  js  c++  java
  • 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 了

  • 相关阅读:
    Mybatis查询select操作
    插入排序和它的进化希尔排序
    关于c头文件的使用的小记录
    Mybatis介绍
    spring tool suite开发环境搭建
    一个简单的jsp+servlet登录界面的总结
    纠正关于线程的错误理解
    表达式语言EL简单学习
    [BZOJ 1804] Flood
    [POJ 1739] Tony's Tour
  • 原文地址:https://www.cnblogs.com/drafire/p/10646856.html
Copyright © 2011-2022 走看看