Java String 与 StringBuer 用法区别
2007-05-22 10:03
String 类用来表示那些创建后就不会再改变的字符串,它是 immutable 的。
而 StringBuer 类用来表示内容可变的字符串,并提供了修改底层字符串的方
法。
--当我们进行字符拼接时,请使用 StringBuer 类而非 String 类,因为前
者将比后者快上百倍。
的确,在程序的太多场合我们都会进行字符串拼接工作,简单的代码示例如
下:
String str="You are nice.";
str+="I love you so much.";
如果用 StringBuer 类的话,代码如下:
StringBuer str= new StringBuer("You are nice.");
str.append("I love you so much.");
从表面看来 String 类只用一个加号(+)便完成了字符串的拼接,而
StringBuer 类却要调用一个 append()方法,是否实现起来更简洁,更单纯
呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:
经编译后程序的 bytecode(字节码)展示出了实质: 在用 String 类对象直
接拼接时,JVM 会创建一个临时的 StringBuer 类对象,并调用其 append()
方法完成字符串的拼接,这是因为 String 类是不可变的,拼接操作不得不使用
StringBuer 类(并且--JVM 会将"You are nice."和"I love you so
much."创建为两个新的 String 对象)。之后,再将这个临时 StringBuer 对
象转型为一个 String,代价不菲!可见,在这一个简单的一次拼接过程中,我
们让程序创建了四个对象:两个待拼接的 String,一个临时 StringBuer,和
最后将 StringBuer 转型成为的 String--它当然不是最初的 str 了,这个引
用的名称没变,但它指向了新的 String 对象。
而如果直接使用 StringBuer 类,程序将只产生两个对象:最初的
StringBuer 和拼接时的 String("I love you so much."),也不再需要创
建临时的 StringBuer 类对象而后还得将其转换回 String 对象。
可以想象,当我们的字符串要被循环拼接若干段时,用 String 类直接操作会带
来多少额外的系统开销,生成多少无用的临时 StringBuer 对象,并处理多少
次无谓的强制类型转换哪。
评论1