何时使用 String, StringBuffer, StringBuilder
2014-01-03 10:19
260 查看
性能分析:
在进行字符串串联操作时(串联的不光是字符串类型)我们有三种选择:
采用 String 的 '+' 操作符;
采用 StringBuffer.append() 方法;
采用 StringBuilder.append() 方法;
实际上 2 和 3 差不多,只不过 StringBuilder 不是线程安全的,在讨论本文问题时可以只讨论其一,我们以 StringBuffer 为例。
两种串联方法最大的区别在于性能上,使用 String 的 ‘+’ 操作符相比 StringBuffer 的 append() 方法是低效的,突出表现在循环控制语句中需要大量进行字符串串联的情况下。考虑下面的代码:
它相当于进行了下面的操作:
在每一级循环中都会创建一个新的对象,且保存一个新创建的字符串,垃圾回收器不会及时回收这些已经利用过的字符串,于是内存中的字符串数据呈等差数列和增长,空间复杂度达到 O(n^2);而创建的冗余字符串对象也牺牲了CPU资源,耗时增加。
解决以上低效问题的途径是采用 StringBuffer 或者 StringBuilder 的 append() 方法,其空间是按需动态追加的,不会产生过多冗余的字符串,从而节省了内存,由于整个循环只需要一个 StringBuffer 或 StringBuilder 对象,所以也不会产生冗余的CPU消耗,节省了时间,改进后的版本如下:
总结:
如果需要大量地遍历进行字符串串联,则性能是首要需要考虑的,此时采用 StringBuffer 或者 StringBuilder;
否则,考虑到程序的可读性,应该使用 String 的 '+' 操作符,这时性能差别可以忽略不计;
StringBuffer 和 StringBuilder 的区别在于 StringBuffer 是线程安全的,StringBuilder 则不然。
参考:
谷歌工程师 Jon Skeet 的定量分析:http://www.yoda.arachsys.com/java/strings.html
在进行字符串串联操作时(串联的不光是字符串类型)我们有三种选择:
采用 String 的 '+' 操作符;
采用 StringBuffer.append() 方法;
采用 StringBuilder.append() 方法;
实际上 2 和 3 差不多,只不过 StringBuilder 不是线程安全的,在讨论本文问题时可以只讨论其一,我们以 StringBuffer 为例。
两种串联方法最大的区别在于性能上,使用 String 的 ‘+’ 操作符相比 StringBuffer 的 append() 方法是低效的,突出表现在循环控制语句中需要大量进行字符串串联的情况下。考虑下面的代码:
String contents = ""; String line; while ( (line=reader.readLine()) != null) { contents += line+"\n"; }
它相当于进行了下面的操作:
String contents = ""; String line; while ( (line=reader.readLine()) != null) { contents = new StringBuffer (contents).append(line).append("\n").toString(); }
在每一级循环中都会创建一个新的对象,且保存一个新创建的字符串,垃圾回收器不会及时回收这些已经利用过的字符串,于是内存中的字符串数据呈等差数列和增长,空间复杂度达到 O(n^2);而创建的冗余字符串对象也牺牲了CPU资源,耗时增加。
解决以上低效问题的途径是采用 StringBuffer 或者 StringBuilder 的 append() 方法,其空间是按需动态追加的,不会产生过多冗余的字符串,从而节省了内存,由于整个循环只需要一个 StringBuffer 或 StringBuilder 对象,所以也不会产生冗余的CPU消耗,节省了时间,改进后的版本如下:
String contents = ""; String line;
StringBuffer buffer = new StringBuffer(); while ( (line=reader.readLine()) != null) {
buffer.append(line).append("\n"); }
contents = buffer.toString();
总结:
如果需要大量地遍历进行字符串串联,则性能是首要需要考虑的,此时采用 StringBuffer 或者 StringBuilder;
否则,考虑到程序的可读性,应该使用 String 的 '+' 操作符,这时性能差别可以忽略不计;
StringBuffer 和 StringBuilder 的区别在于 StringBuffer 是线程安全的,StringBuilder 则不然。
参考:
谷歌工程师 Jon Skeet 的定量分析:http://www.yoda.arachsys.com/java/strings.html
相关文章推荐
- Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
- 字符串的使用(string,StringBuffer,StringBuilder)
- 9.1.1 Java高效运行必备:如何选择使用String、StringBuffer与StringBuilder
- String,StringBuilder和StringBuffer区别及使用场景
- 详述 Java 语言中的 String、StringBuffer 和 StringBuilder 的使用方法及区别
- 如何选择使用String、StringBuffer与StringBuilder
- String、StringBuffer、StringBuilder的区别及使用
- string ,stringbuffer, stringbuilder 的使用
- Java_String_正确使用String、StringBuffer、StringBuilder
- String、StringBuffer和StringBuilder的使用
- String,StringBuffer,StringBuilder的区别及使用
- 朝花夕拾:Java中String,StringBuffer,StringBuilder使用方法以及异同比较
- 正确使用String,StringBuffer,StringBuilder
- String-StringBuffer-StringBuilder使用不同点和注意点
- Java 中字符串拼接 String 和 StringBuilder(StringBuffer)的使用
- [编写高质量代码:改善java程序的151个建议]建议54:正确使用String,StringBuffer,StringBuilder
- String,StringBuffer,StringBuilder之间的区别,以及使用中该注意什么(转)
- 使用StringBuilder或StringBuffer代替string
- 深入理解String类型、StringBuilder、StringBuffer的区别与使用
- Java基础知识强化09:String、StringBuffer和StringBuilder使用