栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

字符串串联:concat()与“ +”运算符

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

字符串串联:concat()与“ +”运算符

不,不是。

首先,语义上略有不同。如果a是null,则

a.concat(b)
抛出一个
NullPointerException
,但a+=b将把原来的值a就好像它是null。此外,该
concat()
方法仅接受
String
值,而+操作员会将参数无提示地转换为String(使用
toString()
对象的方法)。因此,该concat()方法在接受方面更加严格。

要深入了解,请写一个简单的类

a += b
;

public class Concat {    String cat(String a, String b) {        a += b;        return a;    }}

现在与一起拆卸

javap -c
(包括在Sun JDK中)。您应该会看到一个列表,其中包括:

java.lang.String cat(java.lang.String, java.lang.String);  Code:   0:   new     #2; //class java/lang/StringBuilder   3:   dup   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V   7:   aload_1   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;   11:  aload_2   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/    String;   18:  astore_1   19:  aload_1   20:  areturn

所以,a += b相当于

a = new StringBuilder()    .append(a)    .append(b)    .toString();

该concat方法应该更快。但是,使用更多的字符串

StringBuilder
,至少在性能方面,该方法是成功的。

Stringand的源代码

StringBuilder
(及其包专用基类)在Sun JDK的src.zip中可用。您会看到正在建立一个char数组(根据需要调整大小),然后在创建final时将其丢弃String。实际上,内存分配出奇的快。

更新:正如

Pawel Adamski
指出的那样,在最近的
HotSpot
中,性能已经发生了变化。javac仍然产生完全相同的代码,但是字节码编译器作弊。简单的测试完全失败,因为整个代码主体都被丢弃了。总结
System.identityHashCode
(不是
String.hashCode
)表明
StringBuffer
代码有一点优势。下一次更新发布时或使用其他JVM时,可能会发生更改。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号