美文网首页
String,StringBuffer,StringBuilde

String,StringBuffer,StringBuilde

作者: 程序员财富自由之路 | 来源:发表于2017-10-13 09:55 被阅读40次

    String:

    源码:

    public final class String

    implements java.io.Serializable, Comparable, CharSequence {

    /** The value is used for character storage. */

    private final char value[];

    /**

    * Initializes a newly created {@code String} object so that it represents

    * an empty character sequence.  Note that use of this constructor is

    * unnecessary since Strings are immutable.

    */

    public String() {

    this.value = "".value;

    }

    /**

    * Initializes a newly created {@code String} object so that it represents

    * the same sequence of characters as the argument; in other words, the

    * newly created string is a copy of the argument string. Unless an

    * explicit copy of {@code original} is needed, use of this constructor is

    * unnecessary since Strings are immutable.

    *

    * @param  original

    *         A {@code String}

    */

    public String(String original) {

    this.value = original.value;

    this.hash = original.hash;

    }

    /**

    * Allocates a new {@code String} so that it represents the sequence of

    * characters currently contained in the character array argument. The

    * contents of the character array are copied; subsequent modification of

    * the character array does not affect the newly created string.

    *

    * @param  value

    *         The initial value of the string

    */

    public String(char value[]) {

    this.value = Arrays.copyOf(value, value.length);

    }

    }

    总结:

    1. 类final修饰的,可见String 是不可继承的

    2. value也是final修饰的,可见,一经创建,不可修改

    3. 新建对象有几种方法new String(), new String(字符串对象),new String(字符数组)等。

    StringBuffer:

    源码:

    public final class StringBuffer

    extends AbstractStringBuilder

    implements java.io.Serializable, CharSequence

    {

    /**

    * Constructs a string buffer with no characters in it and an

    * initial capacity of 16 characters.

    */

    public StringBuffer() {

    super(16);

    }

    /**

    * Constructs a string buffer with no characters in it and

    * the specified initial capacity.

    *

    * @param      capacity  the initial capacity.

    * @exception  NegativeArraySizeException  if the {@code capacity}

    *               argument is less than {@code 0}.

    */

    public StringBuffer(int capacity) {

    super(capacity);

    }

    /**

    * Constructs a string buffer initialized to the contents of the

    * specified string. The initial capacity of the string buffer is

    * {@code 16} plus the length of the string argument.

    *

    * @param   str   the initial contents of the buffer.

    */

    public StringBuffer(String str) {

    super(str.length() + 16);

    append(str);

    }

    @Override

    public synchronized StringBuffer append(Object obj) {

    toStringCache = null;

    super.append(String.valueOf(obj));

    return this;

    }

    @Override

    public synchronized StringBuffer append(String str) {

    toStringCache = null;

    super.append(str);

    return this;

    }

    @Override

    public synchronized String toString() {

    if (toStringCache == null) {

    toStringCache = Arrays.copyOfRange(value, 0, count);

    }

    return new String(toStringCache, true);

    }

    }

    总结:

    可以看到StringBuffer是线程安全的,当修改StringBuffer对象调用append方法是加锁的

    如果想转换成String 对象,可以调用 toString() 方法

    StringBuffer 是可变的,可以对StringBuffer内容进行更改

    StringBuilder:

    源码:

    public final class StringBuilder

    extends AbstractStringBuilder

    implements java.io.Serializable, CharSequence

    {

    public StringBuilder(int capacity) {

    super(capacity);

    }

    /**

    * Constructs a string builder initialized to the contents of the

    * specified string. The initial capacity of the string builder is

    * {@code 16} plus the length of the string argument.

    *

    * @param   str   the initial contents of the buffer.

    */

    public StringBuilder(String str) {

    super(str.length() + 16);

    append(str);

    }

    /**

    * Constructs a string builder that contains the same characters

    * as the specified {@code CharSequence}. The initial capacity of

    * the string builder is {@code 16} plus the length of the

    * {@code CharSequence} argument.

    *

    * @param      seq   the sequence to copy.

    */

    public StringBuilder(CharSequence seq) {

    this(seq.length() + 16);

    append(seq);

    }

    /**

    * Appends the string representation of the {@code Object} argument.

    *

    * The overall effect is exactly as if the argument were converted

    * to a string by the method {@link String#valueOf(Object)},

    * and the characters of that string were then

    * {@link #append(String) appended} to this character sequence.

    *

    * @param   obj   an {@code Object}.

    * @return  a reference to this object.

    */

    public AbstractStringBuilder append(Object obj) {

    return append(String.valueOf(obj));

    }

    /**

    * Appends the specified string to this character sequence.

    *

    * The characters of the {@code String} argument are appended, in

    * order, increasing the length of this sequence by the length of the

    * argument. If {@code str} is {@code null}, then the four

    * characters {@code "null"} are appended.

    *

    * Let n be the length of this character sequence just prior to

    * execution of the {@code append} method. Then the character at

    * index k in the new character sequence is equal to the character

    * at index k in the old character sequence, if k is less

    * than n; otherwise, it is equal to the character at index

    * k-n in the argument {@code str}.

    *

    * @param   str   a string.

    * @return  a reference to this object.

    */

    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;

    }

    @Override

    public String toString() {

    // Create a copy, don't share the array

    return new String(value, 0, count);

    }

    }

    抽象类AbstractStringBuilder :

    abstract class AbstractStringBuilder implements Appendable, CharSequence {

    /**

    * The value is used for character storage.

    */

    char[] value;

    /**

    * The count is the number of characters used.

    */

    int count;

    /**

    * This no-arg constructor is necessary for serialization of subclasses.

    */

    AbstractStringBuilder() {

    }

    @Override

    public abstract String toString();

    }

    总结:

    1.可以看到StringBuilder 和StringBuffer方法很相似,区别是StingBuilder不是线程安全的

    2.相同点 都继承抽象类 AbstractStringBuilder, 都是可变的

    最后总结:

    都有toString()方法 在接口CharSequence中定义了toString()方法

    针对以上String,StringBuffer,与StringBuilder 稍做总结:

    String是不可变的,StringBuffer,StringBuilder是可变的

    StringBuffer,StringBuilder 都有 toString()方法可以转化未String对象

    StringBuffer与StringBuilder都继承同一抽象类AbstractStringBuilder

    StringBuffer是线程安全的,StingBuilder是非线程安全的

    获取更多内容, 可关注公众号  程序猿IT视界

    相关文章

      网友评论

          本文标题:String,StringBuffer,StringBuilde

          本文链接:https://www.haomeiwen.com/subject/wwzhyxtx.html