与Java中的StringBuilder相比,字符串的优势

Azam Khan |

为什么有人会String用完StringBuilder

我知道以下事实:

  • StringBuilder相对于String的优势
  • 字符串是不可变的,
  • 而且我们可以使用StringBuilder进行String所具有的一切功能。
  • 而且也不能说String更快,因为两者都不同步。

那么,为什么有人会使用String如果StringBuilder已经存在呢?

StringBuilder是可变的,而String是不可变的不可变意味着它不会更改,因此您关于不同步的观点毫无意义-没有同步的可能更改。

简而言之,如果您不需要StringBuilders的其他功能(这在字符串中很常见),则String的效率更高。它还具有JVM中高度优化的特殊处理功能,这是Java中其他对象所没有的。

特定于字符串的最优化的示例(字符串池)使字符串的行为像常量一样,因为可以在整个应用程序中自动共享同一实例,从而节省了内存和时间。对于其他对象,这是不可能自动实现的,对于可变对象,通常甚至都不希望这样做。与定制池相比,String池已被证明可以容纳更多具有更好性能的对象只使用一个String实例的全部实例来提高性能的过程称为string interning

由于您仅使用一个实例,因此在比较时,只需比较参考。对于每个StringBuilder实例,您都需要评估对象的内容才能做到这一点。Stringbuilder使用Array作为支持对象,并且必须遍历该Array才能获取其内容,这要花很多钱这假设您对字符串内容感兴趣,而不是对象实例,这在String / StringBuilder / StringBuffer中几乎总是这样。


比较String和StringBuilder内容的简单性能测试:

public class CompTest {

  // fastest way to compare StringBuilder contents according to
  // http://stackoverflow.com/questions/11007387/what-is-an-efficient-way-to-compare-stringbuilder-objects
  static boolean contentEquals(StringBuilder sb1, StringBuilder sb2) {
    if (sb1.length() != sb2.length()) return false;
    for (int i = 0, len = sb1.length(); i < len; i++) {
      if (sb1.charAt(i) != sb2.charAt(i)) return false;
    }
    return true;
  }

  public static void main(String args[]) {

    StringBuilder fooSb = new StringBuilder("foo");
    StringBuilder barSb = new StringBuilder("foo");
    String foo = "foo";
    String bar = "foo";

    System.out.println(foo.equals(bar));
         // returns true
    System.out.println(fooSb.equals(barSb));
         // returns false, so cannot be used to check contents
    System.out.println(contentEquals(fooSb,barSb));
         // returns true

    long time;

    time = System.currentTimeMillis();
    for (int i = 0; i < 2000000000; i++) {
      if (foo.equals(bar)) continue;
    }
    System.out.println("str comparisons took " + (System.currentTimeMillis() - time) + " ms");

    time = System.currentTimeMillis();
    for (int i = 0; i < 2000000000; i++) {
      if (contentEquals(fooSb,barSb)) continue;
    }
    System.out.println("sb comparisons took " + (System.currentTimeMillis() - time) + " ms");

    /* repeat the test as we know JVM is warmed up by now */

    time = System.currentTimeMillis();
    for (int i = 0; i < 2000000000; i++) {
      if (foo.equals(bar)) continue;
    }
    System.out.println("str comparisons took " + (System.currentTimeMillis() - time) + " ms");

    time = System.currentTimeMillis();
    for (int i = 0; i < 2000000000; i++) {
      if (contentEquals(fooSb,barSb)) continue;
    }
    System.out.println("sb comparisons took " + (System.currentTimeMillis() - time) + " ms");

 }
}

结果:

true
false
true
str comparisons took 1244 ms
sb comparisons took 11530 ms
str comparisons took 1231 ms
sb comparisons took 12098 ms

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java:从StringBuilder中删除字符串

来自分类Dev

从 java StringBuilder 中删除子字符串

来自分类Dev

替换StringBuilder字符串中的“字符”

来自分类Dev

与使用here字符串相比,使用bash -c有什么优势?

来自分类Dev

从StringBuilder中删除匹配的字符串

来自分类常见问题

构造多个字符串时,使用StringBuilder有什么显着的性能优势?

来自分类Dev

与Java相比C#字符串混乱

来自分类Dev

在C#StringBuilder字符串中包含空字符

来自分类Dev

将StringBuilder返回为字符串JAVA

来自分类Dev

使用StringBuilder进行JAVA字符串反向

来自分类Dev

如何在StringBuilder中连接子字符串?

来自分类Dev

如何在StringBuilder中连接子字符串?

来自分类Dev

在stringbuilder中搜索字符串并替换整行C#

来自分类Dev

如何将StringBuilder值存储在字符串中

来自分类Dev

字符串与标签文本javascript相比

来自分类Dev

Java中的字符串

来自分类Dev

弹性搜索中整数类型优于字符串字段类型的优势

来自分类Dev

从StringBuilder获取字符串

来自分类Dev

如何使用StringBuilder重建字符串?

来自分类Dev

在stringbuilder中分割字符串

来自分类Dev

StringBuilder子字符串异常

来自分类Dev

stringbuilder的安全字符串插入代码

来自分类Dev

编码StringBuilder查询字符串

来自分类Dev

用 StringBuilder 替换字符串?

来自分类Dev

使用 StringBuilder 连接查询字符串

来自分类Dev

字符串中的特殊字符[JAVA]

来自分类Dev

替换Java字符串中的字符

来自分类Dev

Java字符串中的字符“æ”,“ø”“æ”(Windows)

来自分类Dev

Java:限制字符串中的字符