首页 > 代码库 > String、StringBuffer、StringBuilder三者的区别

String、StringBuffer、StringBuilder三者的区别

        想来只要是学习Java软件编程的都或多或少知道些它们之间的区别,今天偷闲总结一下:

        String:固定长度的字符串,如果值发生了变化则必须重新生成新的String实例;

        StringBuffer:当使用append 和 insert 方法拼接字符串时,每次结果都会对 StringBuffer 对象本身进行操作,不会像String那样生成新的对象再改变对象引用。另外StringBuffer是线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。每个字符串缓冲区都有一定的容量。当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

        String与StringBuffer的区别:

        综上所述,我们可以清楚的发现在字符串对象经常改变的情况下推荐使用StringBuffer,应为StringBuffer比String更节省内存。言尽于此,似乎我们已经得出了String与StringBuffer的区别,呵呵呵,其实我们忽略了一点:在某些特别情况下,String对象的字符串拼接其实是被JVM解释成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer对象慢,而特别是以下的字符串对象生成中,String效率是远要比StringBuffer快的:

        String name1 = “Gao” + “Huan” + “jie”;
        StringBuffer name2 = new StringBuilder(“Gao”).append(“Huan”).append(“jie”);

        通过程序运行你可能会惊讶地发现生成name1对象的速度要比生成name2对象的速度块。其实这是JVM搞的鬼:在JVM 眼里,这个String name1 = “Gao” + “Huan” + “jie”;其实就是:String name1 = “GaoHuanjie”; 所以当然不需要太多的时间了;但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:

        String firstName = “Gao”;
        String secondName = “Huan”;
        String thirdName = “jie”;
        String name1 = firstName + secondName + thirdName;
        这时候JVM就会按照原来的方式去做。

        StringBuilder:一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(也就是说StringBuilder是非线程安全的)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中由于StringBuilder不执行同步,它比StringBuffer要快。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。再次重申:将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。

        StringBuilder与StringBuffer的区别:

        StringBuilder是JDK1.5新增加的类而StringBuffer从JDK1.0就有;如上所述StringBuilder是非线程安全的而StringBuffer是线程安全,基于这一点,在不考虑线程安全的前提下建议使用StringBuilder。

String、StringBuffer、StringBuilder三者的区别