• StringBuffer 和 StringBuilder


    (1)
    /**
    * This interface represents an ordered set of characters and defines the
    * methods to probe them.描述有序字符序列的接口。定义了探测这个序列的方法。
    */

    public interface CharSequence 

        /**
         * Returns a {@code CharSequence} from the {@code start} index (inclusive)
         * to the {@code end} index (exclusive) of this sequence.
         *
         * @param start    注意:位于start位置的字符, 是包含在子序列中的第一个字符
         *            the start offset of the sub-sequence. It is inclusive, that
         *            is, the index of the first character that is included in the
         *            sub-sequence.
         * @param end        位于end位置的字符,是不包含在子序列中第一个字符。也就是说,只包含index是 end-1的字符
         *            the end offset of the sub-sequence. It is exclusive, that is,
         *            the index of the first character after those that are included
         *            in the sub-sequence
         * @return the requested sub-sequence.
         * @throws IndexOutOfBoundsException
         *             if {@code start < 0}, {@code end < 0}, {@code start > end},
         *             or if {@code start} or {@code end} are greater than the
         *             length of this sequence.
         */
        public CharSequence subSequence(int start, int end);

    (2)

    /**
    * A modifiable {@link CharSequence sequence of characters} for use in creating
    * and modifying Strings. 
    * {@link StringBuffer} and {@link StringBuilder}.

    */

    可变的字符序列,用于生成和修改String。 这个类的目的是作为StringBuffer和StringBuilder的基类。
    abstract class AbstractStringBuilder 

    维护一个char[] ,count = value.length() 既然value.length是自增的,为什么还要count字段。 其实count只是用于 诸如value[count++] = c; 这样的添加删除操作。

      static final int INITIAL_CAPACITY = 16;//初始大小16
    
      private char[] value; 
    
      private int count;
      private boolean shared;
    
        private void enlargeBuffer(int min) {
            int newCount = ((value.length >> 1) + value.length) + 2;
            char[] newData = new char[min > newCount ? min : newCount];
            System.arraycopy(value, 0, newData, 0, count);
            value = newData;
            shared = false;
        }
        final void appendNull() {
            int newCount = count + 4;
            if (newCount > value.length) {
                enlargeBuffer(newCount);
            }
            value[count++] = 'n';
            value[count++] = 'u';
            value[count++] = 'l';
            value[count++] = 'l';
        }

    (3)

    /**
     * A modifiable {@link CharSequence sequence of characters} for use in creating
     * strings, where all accesses are synchronized. This class has mostly been replaced
     * by {@link StringBuilder} because this synchronization is rarely useful. This
     * class is mainly used to interact with legacy APIs that expose it.
    用于生成String的一个可变字符序列,所有存取操作都是同步synchronized的。通常由StringBuilder取代因为synchronization很少有用。
    这个类主要用于 和它有关的遗留下来的API互通。
    * <p>For particularly complex string-building needs, consider {
    @link java.util.Formatter}. * * <p>The majority of the modification methods on this class return {@code * this} so that method calls can be chained together. For example: * {@code new StringBuffer("a").append("b").append("c").toString()}. * * @see CharSequence * @see Appendable * @see StringBuilder * @see String * @see String#format * @since 1.0 */ public final class StringBuffer extends AbstractStringBuilder implements Appendable, Serializable, CharSequence {
    用于生成String的一个可变字符序列。作为StringBuffer的非并发使用的直接替代品。
    和StringBuffer不同,这个类不是synchronized。
    /**
     * A modifiable {@link CharSequence sequence of characters} for use in creating
     * strings. This class is intended as a direct replacement of
     * {@link StringBuffer} for non-concurrent use; unlike {@code StringBuffer} this
     * class is not synchronized.
     *
     * <p>For particularly complex string-building needs, consider {@link java.util.Formatter}.
     *
     * <p>The majority of the modification methods on this class return {@code
     * this} so that method calls can be chained together. For example:
     * {@code new StringBuilder("a").append("b").append("c").toString()}.
     *
     * @see CharSequence
     * @see Appendable
     * @see StringBuffer
     * @see String
     * @see String#format
     * @since 1.5
     */
    public final class StringBuilder extends AbstractStringBuilder implements
            Appendable, CharSequence, Serializable {

    比较了一下源码,StringBuffer和StringBuilder的唯一区别:

    就是Override了它和StringBuilder的共同父类AbstractStringBuilder中的一些操作,使其变成synchronized方法。

    而StringBuilder没有Override,直接使用的父类中的方法。

    以下只是部分例子:

      @Override
        public synchronized char charAt(int index) {
            return super.charAt(index);
        }
    
        @Override
        public synchronized int codePointAt(int index) {
            return super.codePointAt(index);
        }
    
        @Override
        public synchronized int codePointBefore(int index) {
            return super.codePointBefore(index);
        }
    
        @Override
        public synchronized int codePointCount(int beginIndex, int endIndex) {
            return super.codePointCount(beginIndex, endIndex);
        }
  • 相关阅读:
    学习:HelloWorld项目目录
    学习:java设计模式—Adapter模式
    学习:java设计模式—Decorator模式
    MyEclipse8.5/8.6不能安装ADT
    学习:Android框架
    笔记:代码整洁之道
    JVM常用启动参数
    春雷第一声初入博客
    在Winform中更改控件导致designer中代码自动移除解决方法
    C#生成灰度图片:拖动图片到picturebox显示,拖动picturebox图片到资源管理器 (Drag & drop )
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4435589.html
Copyright © 2020-2023  润新知