StringBuild使用与原理
Posted 黑色很白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringBuild使用与原理相关的知识,希望对你有一定的参考价值。
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的实质。
以上是关于StringBuild使用与原理的主要内容,如果未能解决你的问题,请参考以下文章
String,StringBuffer,StringBuild的区别
StringStringBuffer和StringBuild