gpt4 book ai didi

java - Java 中 String 相对于 StringBuilder 的优势

转载 作者:行者123 更新时间:2023-12-01 09:06:38 24 4
gpt4 key购买 nike

为什么有人会使用String超过StringBuilder .

我知道以下事实:

  • StringBuilder 相对于 String 的优点,
  • 字符串是不可变的,
  • 我们可以用 StringBuilder 做 String 能做的一切事情,甚至更多。
  • 也不能说 String 更快,因为两者都是非同步的。

那么为什么有人会使用 String如果StringBuilder已经在那里了吗?

最佳答案

StringBuilder 是可变的,而 String 是不可变的。不可变意味着它不会改变,所以你关于它不同步的观点是没有意义的 - 没有可能的更改可以同步。

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

最显着的字符串特定优化示例是字符串池,它使字符串表现得像常量,因为同一个实例可以在整个应用程序中自动共享,从而节省内存和时间。对于其他对象来说,这并不是自动可能的,对于可变对象来说,这通常甚至是不需要的。与定制池相比,字符串池已被证明允许 more objects with better performance 。为了提高性能而仅使用一个 String 实例的过程称为 string interning .

由于您只使用一个实例,因此在比较时,您只需比较引用即可。对于每个 StringBuilder 实例,您需要评估对象的内容才能执行此操作。弦乐构建器uses an Array as a backing object并且必须迭代该数组才能获取其内容,这是相当昂贵的。假设您对字符串内容而不是对象实例感兴趣,这几乎总是 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

关于java - Java 中 String 相对于 StringBuilder 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com