从内存分配情况来解析String对象的特性。
String类的Java介绍
打开String的源码,类注释中有这么一段话:Strings are constant; their values cannot be changed after they are
created. String buffers support mutable strings.Because String objects are immutable they can be shared
这里很明确的说明了String的特点:String是值不可变(immutable)的常量
String类的两个成员变量
private final char value[];
private final int count;
从代码上我们可以直观的看出来,String的本质其实是字符数组。
String类的拼接
前面提到过String类的值是不可变的,但是我们在使用String类的方法中,有一个叫concat的方法,它的效果好像
是在做字符串的改变,我们可以看看这个方法内部到底是如何实现的呢?
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
将原来value中的字符copy到buf中来,再把需要concat的字符串值也copy到buf中来,这样子,buf中就包含了
concat之后的字符串值。下面就是问题的关键了,如果value不是final的,直接让value指向buf,然后返回this,
则大功告成,没有必要返回一个新的String对象。由于value是final型的,所以无法指向新定义的大容量数组buf,
那怎么办呢?“return new String(0, count + otherLen, buf);”,这是String类concat实现方法的最后一条语句,重
新new一个String对象返回。