标签:因此 执行 com obj http storage out 字符 pre
StringBuild的使用:
1、创建:
StringBuilder sb=new StringBuilder();
StringBuilder sb=new StringBuilder(200);
sb.append("Hello");
sb.append(" World!");
System.out.println(sb.toString());
// 输出结果:Hello World!
这个是StringBuild最常用的用法,把需要拼接的字符串拼接使用append(String str)放入StringBuild对象中,然后就可以进行拼接。最后使用toString()方法进行转换就可以了。
2、
在java中,字符创是不可变的,每一次的字符串都是新的值,因此,在需要对字符串进行拼接操作的时候,我们是使用StringBuild,那么,为什么StringBuild可以呢?
看源码:

因此,StringBuild是继承自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;
。。。
}
可以看出,AbstractStringBuilder里面有两个变量value和count,这两个是关键,为什么是关键我们接着往下看:
看StringBuild我们最常用的append()方法:
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
最后调用到基类,也就是AbstractStringBuilder 的方法里去了,,那么我们再看AbstractStringBuilder 中的append()方法。
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;
}
先看前两行,判断是不是空的,如果是空的就执行appendNull()操作,这个操作是什么呢?代码如下:
private AbstractStringBuilder appendNull() {
int c = count;
ensureCapacityInternal(c + 4);
final char[] value = this.value;
value[c++] = ‘n‘;
value[c++] = ‘u‘;
value[c++] = ‘l‘;
value[c++] = ‘l‘;
count = c;
return this;
}
可见,操作是把长度count也增加4,把value增加null的四个字符,然后返回this,也就是说把null放入了AbstractStringBuilder的value中,value是一个char[]数组。而count指的正是count的值。
而看append()方法的后半段,则是先扩宽value数组的长度,然后调用String的getChars方法把传入的字符串放入value数组中,之后再增加count的长度。
因此,再toString()
之前,StringBuild的append操作实际上是把str变成了char数组存入了变量value中。那么toString()操作呢?
@Override
public String toString() {
// Create a copy, don‘t share the array
return new String(value, 0, count);
}
可见,是调用了String的构造方法,把chae数组value变成了String类型返回。这个就是StringBuild的实质。
标签:因此 执行 com obj http storage out 字符 pre
原文地址:http://www.cnblogs.com/heisehenbai/p/7739924.html