java中String和StringBuffer的区别

时间:2014-03-06 04:33:30

标签: string stringbuffer

我知道这个问题多年前在许多网站上得到了多次回答。:P 我仍有一些疑问,所以想到发布这个。 基本区别在于,String是不可变的,每次我们对String执行任何操作时,它都会创建一个新的String对象。

例如: -

String str = "some"; str = str + " text"

在上面的情况下,创建2个新的字符串而不是修改现有的str,这可以通过使用StringBuffer来避免。

例如: - StringBuffer str = new StringBuffer(); str.append("try"); str.append("this");

我的问题是,要追加方法,我们再次传递一个String。在上面的情况下,不会在字符串池中为“try”和“this”创建新的String对象。

4 个答案:

答案 0 :(得分:1)

是的,为"try""this"创建了新的String对象。这里的好处是StringBuffer在内部将字符串存储为动态调整大小的数组。

如果我们连接两个以上的字符串会更有效:

"try" + "this" + "test"

这可能会创建5个String对象,因为您需要中间值。 (文字的技术连接是在编译时执行的,所以这只是一个概念性的例子。)如果编译器不是文字,那么编译器也可以将上面的代码段重构为使用StringBuilder

StringBuilderStringBuffer的较新且非同步版本。一般来说,您应该更喜欢StringBuilder。这两个类之间的区别在"StringBuilder and StringBuffer in Java"中有所介绍。

答案 1 :(得分:0)

主要区别(除了“StringBuffer”是可变的,“String”是不可变的)是性能。 我找到了一个很好的解释here

但是我也发现StringBuilder比StringBuffer更受欢迎,因为StringBuffer是同步的而StringBuilder不是。

答案 2 :(得分:0)

对于一些字符串,我们真的看不出任何差异。

所以我想一个例子可以告诉你为什么你应该使用StringBuffer(或StringBuilder,根据你的需要)而不是使用+

的字符串连接

试一下,亲眼看看

public class UseSB {
    static int x = 100000;
    public static void main(String[] args) {
        long i1 = System.currentTimeMillis();
        main1();
        long i2 = System.currentTimeMillis();
        main2();
        long i3 = System.currentTimeMillis();
        System.out.println(i2-i1);
        System.out.println(i3-i2);
    }

    public static void main1() {
        String s = "x";
        for(int i=0;i<x;i++){
            s = s + Integer.toString(i);
        }
        System.out.println(s.length());
    }

    public static void main2() {
        StringBuffer s = new StringBuffer("x");
        for(int i=0;i<x;i++){
            s.append(Integer.toString(i));
        }
        System.out.println(s.toString().length());
    }

}

答案 3 :(得分:0)

  • <强>字符串: 字符串是immutable(一旦创建无法更改)对象。作为String创建的对象存储在常量字符串池中。 Java中的每个不可变对象都是线程安全的,这意味着String也是线程安全的。两个线程不能同时使用String。分配后的字符串无法更改。

  • <强>的StringBuffer: StringBuffer是mutable。这意味着可以更改对象的值。通过StringBuffer创建的对象存储在堆中。 StringBuffer与StringBuilder具有相同的方法,但StringBuffer中的每个方法都是同步的,即StringBuffer是线程安全的。

    由于这个原因,它不允许两个线程同时访问同一个方法。每个方法一次只能由一个线程访问。

    但由于线程安全属性,StringBuffer的性能会受到攻击,因此线程安全也有缺点。因此,当调用每个类的相同方法时,StringBuilder比StringBuffer更快。

  • <强> StringBuilder的: StringBuilder与StringBuffer相同,即它将对象存储在堆中,也可以对其进行修改。 StringBuffer和StringBuilder之间的主要区别在于StringBuilder也不是线程安全的。 StringBuilder很快,因为它不是线程安全的。

来源: http://javahungry.blogspot.com/2013/06/difference-between-string-stringbuilder.html