这篇文章也是我对StringBuffer的一点看法,若有不妥之处,还请大家指出
估计Java初学者都知道,String是不可变字符串,StringBuffer是可变字符串,之前我也是这样理解的,但是今天下午,发现了一个奇怪的现象,发现StringBuffer并非完全可变,所以我将之称为非完全可变字符串。
先看看下面这段
public static void main(String[] args) {
String str = new String("Hello");
str.concat("World");
System.out.println(str);
str.substring(0, 3);
System.out.println(str);
System.out.println("<=========================>");
StringBuffer sb = new StringBuffer("Hello");
sb.substring(0, 3);
System.out.println(sb);
sb.append("World");
System.out.println(sb);
}
其输出结果如下:
Hello
Hello
<=========================>
Hello
HelloWorld
通过对比String的substring和StringBuffer的substring方法可以看出,他们都没有改变原来字符串的值,String很好理解,由于是不可变字符串,所以原字符串肯定不会变,但是为何StringBuffer也没变呢??它不是号称可变字符串嘛,那就应该和其他方法一样啊(比如代码中的append方法),改变原来字符串的值啊,但是这里完全没变嘛,再看看StringBuffer的substring方法具体实现。
public String substring(int start, int end) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (end > count)
throw new StringIndexOutOfBoundsException(end);
if (start > end)
throw new StringIndexOutOfBoundsException(end - start);
return new String(value, start, end - start);
}
由此可见,其他该方法也是产生一个新的字符串,并不会更改原字符串的值。
那这里本人就觉得很不理解,为什么StringBuffer的这个方法更String的一样呢??难道这是一个Bug??应该不是,如果要是,SUN早就应该改过来了,那这里SUN到底是出于什么目的要将StringBuffer的substring这样实现呢??不理解