String,StringBuffer,StringBuilde

2017-10-13  本文已影响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视界

上一篇下一篇

猜你喜欢

热点阅读