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 了

  • 相关阅读:
    jquery筛选数组之grep、each、inArray、map的用法及遍历json对象 [转]
    fontface 自定义字体
    (转)闭包与柯里化
    简单的等级评分效果
    js对象字面量
    利用jqueryRotare实现抽奖转盘
    [转]移动终端开发必备知识
    jQuery ajax中使用serialize() 方法提交表单数据
    css3动画模块transform transition animation属性解释
    【备忘】canvas下图片翻转转自oldj.net(英杰兄)
  • 原文地址:https://www.cnblogs.com/drafire/p/10646856.html
Copyright © 2011-2022 走看看