java字符串连接效率_关于java:字符串连接中的“+”是否会影响效率?

本问题已经有最佳答案,请猛点这里访问。

我在java中使用过String,StringBuilder和StringBuffer。

我想到了这个问题,而我从效率的角度思考。

字符串连接中的"+"是否会影响效率?

我认为这在SO上已经讨论了很多?

是的,我认为规则是你应该使用stringbuilder,如果你连接两个以上的字符串...如果你提前有想法/答案,(1)把它作为额外的信息或( b)不要问你已经知道答案的问题。

是的,但是在大多数情况下它都不重要。

对字符串常量使用'+'是最有效的,因为编译器可以执行连接。

如果要连接两个字符串,concat方法是最有效的,因为它避免使用StringBuilder。

除了向后兼容性之外,几乎没有充分的理由使用StringBuffer。 StringBuilder或StringWriter是更好的选择。但是,它仍然比JDK中的StringBuilder更频繁地使用:P

StringBuffer是死的,长期的StringBuffer

在小型连接的情况下"如此之少"。但是,我有过处理具有许多连接(解析器/过滤器)的类的经验,其中简单地从连接更改为缓冲器追加减半(极慢)执行时间。 Microbenchmarks也不太可能向您显示添加所有这些额外的中间字符串对象的垃圾收集成本,但它们将在您的应用程序的整个生命周期内分摊。

在我的应用程序中,我使用线程本地ByteBuffer并使用不创建任何对象的方法直接读取/写入。 99%的用例非常极端,但它可以将您的日志记录缩短到几微秒。 ;)

如果你在一个语句中连接,那么它将无关紧要,因为编译器/ JIT编译器将使用StringBuilder自动优化它。

因此"a"+b+"c"将优化为(new StringBuilder("a").append(b).append("c")).toString()

但是,如果你在一个循环中连接大量的String,那么明确地使用StringBuilder,因为它会显着加快你的程序。

String a ="";

for( int i = 0; i < 1000000; i++ )

a += i;

应改为

StringBuilder sb = new StringBuilder();

for( int i = 0; i < 1000000; i++ )

sb.append(i);

String a = sb.toString();

在你的例子中:

" Does +" +" use in String concatenation affect efficiency?"

我们必须使用文字字符串,它可能会被编译器取代,所以这比StringBuffer / append / toString更快。

但效率/速度比什么呢?代码执行?代码写作?代码阅读?

自从读了一个

"Foo =" + foo;

很容易,我会推荐它,只要它不重复一百万次,或者是"s + = s2;"重复一次hundret时代。

特别,

System.out.println ("Player" + n +" scores" + player[n].score);

比可读性好得多

System.out.println (new StringBuffer ("Player").append ((Integer.valueOf (n)).toString ().append (" scores").append (...

只需在需要高性能的应用程序中避免它,或者连接大量字符串,或者递归地连接大量字符串。

有点是,但仍然没有

来自JLS,15.18.1.2

字符串连接的优化

An implementation may choose to perform conversion and concatenation

in one step to avoid creating and then discarding an intermediate

String object. To increase the performance of repeated string

concatenation, a Java compiler may use the StringBuffer class or a

similar technique to reduce the number of intermediate String objects

that are created by evaluation of an expression.

对于基本类型,实现还可以通过直接从基本类型转换为字符串来优化包装对象的创建。

如果你使用'+'连接多次,那么在某种程度上是肯定的。堂妹

当你执行String a + String b时,它实际上在内部创建一个StringBuffer对象并使用StringBuffer的append()。因此,每次执行'+'时,都会创建一个新的临时StringBuffer对象,使用"a"初始化,然后附加"b",然后将其转换为字符串对象。

因此,如果您需要多个连接,您应该创建一个StringBuffer(线程安全)/ StringBuilder(而不是线程安全)对象并继续追加,这样就可以避免一次又一次地创建StringBuffer对象。

"multiple"只对你在多个语句中展开字符串是正确的。带+的单个语句与单个字符串构建器一样有效,但读取要好得多(编译器可以更好地优化初始大小)。

我很确定第二段解决了这个问题。

由于字符串是不可变的,因此连接字符串会导致字符串创建。 ie .."A"+"B"+"C"导致"AB"的创建,然后是"ABC"。如果你正在进行多个连接,那么使用StringBuilder总是更有效率(不是旧的但是api相同的StringBuffer,它具有同步成本)

如果你有一个单行连接,编译器会尽可能为你做这个 - 也就是说,如果你编译"A"+"B"+"C",你可能会看到,如果你反编译,像新的StringBuilder("A")。附加("B")。附加("C")。的toString()。但是,编译器无法在多行上优化多个字符串连接 - 即,如果您有多个连接行,您将在每行上看到类似上面的内容,包括额外的StringBuilder创建。最好手动完成。

您可以通过组合一个简单的示例和反编译来自行验证。

这是错误的,如果你写"A"+"B"+"C"你就不会得到中间字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值