1
510
不,不完全是这样。
首先,语义学上有点不同。如果
要查看引擎盖下面,请编写一个简单的类
现在用
所以,
这个
的源代码
更新:
正如PawelAdamski指出的,性能在最近的热点已经发生了变化。
|
2
83
Niyaz 是正确的,但也值得注意的是,特殊的+运算符可以被Java编译器转换成更有效率的东西。Java有一个String Bu建器类,它表示一个非线程安全的、可变的字符串。当执行串串连接时,Java编译器悄悄地转换。
进入之内
对于大字符串来说,这样做效率更高。据我所知,使用concat方法时不会发生这种情况。 但是,当将空字符串连接到现有字符串时,concat方法更有效。在这种情况下,JVM不需要创建新的字符串对象,只需返回现有的字符串对象即可。见 the concat documentation 以确认这一点。 因此,如果您非常关注效率,那么在连接可能为空的字符串时应该使用concat方法,否则使用+方法。但是,性能差异应该可以忽略不计,您可能永远都不应该担心这一点。 |
3
44
我做了一个类似于@marcio的测试,但是用了以下循环:
为了更好的衡量,我投球了
我还没有对类进行反编译以查看内部结构或通过分析器运行它,但我怀疑
|
4
22
汤姆准确地描述了+运算符的作用。它创建了一个临时的
然而,到目前为止,所有的答案都忽略了热点运行时优化的影响。具体来说,这些临时操作被认为是一种常见的模式,并在运行时被更高效的机器代码所取代。 @马西奥:你创造了一个 micro-benchmark ;对于现代JVM,这不是分析代码的有效方法。 运行时优化之所以重要,是因为一旦热点出现,代码中的许多差异——甚至包括对象创建——都是完全不同的。唯一确定的方法是分析代码 就地 . 最后,所有这些方法实际上都非常快。这可能是过早优化的情况。如果您有很多串接字符串的代码,那么获得最大速度的方法可能与您选择的运算符和您使用的算法无关! |
5
21
做些简单的测试怎么样?使用以下代码:
测试了几次。这个
这个结果让我吃惊,因为
为什么编译器不能优化“a+b”代码中的字符串创建,因为知道它总是产生相同的字符串?它可以避免创建新的字符串。 如果你不相信上面的说法,那就测试一下你自己。 |
6
20
大多数答案来自2008年。看来事情已经随着时间的推移而改变了。我用JMH制作的最新基准显示了Java 8
我的基准:
结果:
|
7
4
基本上,+和
伙计们,这是 + 以及 康塔特 方法。 享受: |
8
2
为了完整起见,我想补充一下“+”运算符的定义可以在 JLS SE8 15.18.1 :
关于实施,JLS表示:
因此,从“Java编译器可以使用StringBuffer类或类似的技术来减少”,不同的编译器可以产生不同的字节码。 |
9
2
这个 +算子 可以在字符串和string、char、integer、double或float数据类型值之间工作。它只是在串联之前将值转换为字符串表示形式。 这个 康塔特算子 只能对字符串执行。它检查数据类型的兼容性,如果不匹配则抛出一个错误。 除此之外,您提供的代码执行相同的操作。 |
10
2
我不这么认为。
我想
|
11
0
当使用+时,速度会随着字符串长度的增加而降低,但当使用concat时,速度更稳定,最佳选择是使用具有稳定速度的StringBuilder类来实现这一点。 我想你能理解为什么。但是创建长字符串的最好方法是使用StringBuilder()和Append(),这两种速度都是不可接受的。 |
Dima Malko · 如何在指定符号前添加符号? 2 年前 |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Manan Girdhar · 拆分字符串并仅在java中使用第二部分 2 年前 |
AnxiousLuna · Python使用len()获取数组索引数 2 年前 |
antonoyaro8 · 数据帧中每列上的Grepl 2 年前 |