String StringBuffer StringBuilder之间的区别

来源:互联网 发布:腐烂国度生命线优化 编辑:程序博客网 时间:2024/06/13 21:39

1、String

String 的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低,而且耗费大量内存空间。

2、StringBuffer

StringBuffer可变类和线程安全的字符窜操作类,但是StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,在内存使用上要优于String

StringBuffer 默认分配16字节长度的缓冲区,当字符串超过该大小时,会自动增加缓冲区长度,而不是生成新的对象。

StringBuffer不像String,只能通过 new 来创建对象,不支持简写方式,例如:

StringBuffer str1 = new StringBuffer();  // 分配16个字节长度的缓冲区

StringBuffer str2 = =new StringBuffer(512);  // 分配512个字节长度的缓冲区

// 在缓冲区中存放了字符串,并在后面预留了16个字节长度的空缓冲区

String和StringBuffer的效率对比:为了更加明显地看出它们的执行效率,下面的代码,将26个英文字母加了10000次。

public class Demo {    public static void main(String[] args){        String fragment = "abcdefghijklmnopqrstuvwxyz";        int times = 10000;               // 通过String对象        long timeStart1 = System.currentTimeMillis();        String str1 = "";        for (int i=0; i<times; i++) {            str1 += fragment;        }        long timeEnd1 = System.currentTimeMillis();        System.out.println("String: " + (timeEnd1 - timeStart1) + "ms");               // 通过StringBuffer        long timeStart2 = System.currentTimeMillis();        StringBuffer str2 = new StringBuffer();        for (int i=0; i<times; i++) {            str2.append(fragment);        }        long timeEnd2 = System.currentTimeMillis();        System.out.println("StringBuffer: " + (timeEnd2 - timeStart2) + "ms");    }}

运行结果:
String: 5287ms
StringBuffer: 3ms

结论很明显,StringBuffer的执行效率比String快上千倍,这个差异随着叠加次数的增加越来越明显,当叠加次数达到30000次的时候,运行结果为:
String: 35923ms
StringBuffer: 8ms

所以,强烈建议在涉及大量字符串操作时使用StringBuffer。

3、StringBuilder

StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。


总结

线程安全:
StringBuffer:线程安全
StringBuilder:线程不安全

速度:
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

使用环境:
操作少量的数据使用 String;
单线程操作大量数据使用 StringBuilder;
多线程操作大量数据使用 StringBuffer。 


0 0
原创粉丝点击