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);
    }
时间: 2024-10-06 16:43:19

StringBuffer 和 StringBuilder的相关文章

从String类型字符串的比较到StringBuffer和StringBuilder

1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they ca

String、StringBuffer与StringBuilder之间区别

最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuilder)的原因 String:字符串常

StringBuffer和StringBuilder的区别

1. 在执行速度方面的比较:StringBuilder > StringBuffer 2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时, 实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了.3. StringBuilder:线程非安全的 StringBuffer:线程安全的 当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但

Java:String、StringBuffer和StringBuilder的区别

Java:String.StringBuffer和StringBuilder的区别 1 String String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的. String类的包含如下定义: [java] view plain copy /** The value is used for character storage. */ private final char value[]; /** The offset is the first index

(转)String, StringBuffer和StringBuilder

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象,StringBuffer和StringBuilder类功能基本相似1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a"

String,StringBuffer和StringBuilder三者的讲解

 对于java的学习者而言,无论是初学者,还是java大师,String对于大家而言,也绝对不会陌生.下面本人就从 自己学习的角度大致分析一下String,StringBuffer和StringBuilder这三者的区别和联系.如有不足,欢迎补充说 明~谢谢     1 String类 String类在java的java.lang.String包下面,需要特别说明的是String类是final关键字修饰的,也就是说String类是不能够被继承和修改 的.有人可能会问随说String修饰的类是不能

Java中的String、StringBuffer和StringBuilder

任何语言都离不了字符串的处理.Java中处理字符串的三个类String.StringBuffer和StringBuilder.这三个到底有什么区别呢? 他们三个都是实现了CharSequence接口.但实现过程不一样. 其实他们的使用方法都很简单,这里看下StringBuilder的用法. public class TestStringBuffer{ public static void main(String args[]){ StringBuffer str=new StringBuffer

String、StringBuffer与StringBuilder区别

关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuilder)的原因 String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是"字符创常量",也

【Java】String,StringBuffer与StringBuilder的区别??

String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以

String、StringBuffer与StringBuilder 复习回顾总结

1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String 2.String <(StringBuffer,StringBuilder)的原因 String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是"字符创常量",也就是不可改变的对象.对于这句话的理解你可能会产生这样一个疑问  ,比如这段代码: 1 String s = "