当前位置: 首页 > 面试题库 >

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

屠兴旺
2023-03-14
问题内容

假设字符串a和b:

a += b
a = a.concat(b)

在幕后,他们是同一回事吗?

这里将concat反编译为参考。我也希望能够反编译该+运算符,以查看其作用。

public String concat(String s) {

    int i = s.length();
    if (i == 0) {
        return this;
    }
    else {
        char ac[] = new char[count + i];
        getChars(0, count, ac, 0);
        s.getChars(0, i, ac, count);
        return new String(0, count + i, ac);
    }
}

问题答案:

不,不是。

首先,语义上略有不同。如果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时,可能会发生更改。



 类似资料:
  • 问题内容: 对于字符串连接,我们可以使用or或concat运算符。 我尝试了以下性能测试,发现更快,更有效地进行字符串连接。 字符串连接比较100,000次 : 结果 如果比运算符快,那么什么时候应该使用串联运算符? 问题答案: concat方法始终会生成一个带有串联结果的新String。 plus运算符由StringBuilder创建来支持,它会附加所需的所有String值,并进一步对toStr

  • 问题内容: 假设字符串a和b: 在幕后,他们是同一回事吗? 这里将concat反编译为参考。我也希望能够反编译该+运算符,以查看其作用。 问题答案: 首先,语义上略有不同。如果a是,则抛出一个,但将把原来的值a就好像它是null。此外,该方法仅接受值,而+操作员会将参数无提示地转换为(使用对象的方法)。因此,该方法在接受方面更加严格。 要深入了解,请写一个简单的类 ; 现在与一起拆卸(包括在Sun

  • 本文向大家介绍通过+(字符串串联)运算符进行字符串串联。,包括了通过+(字符串串联)运算符进行字符串串联。的使用技巧和注意事项,需要的朋友参考一下 您可以使用Java的“ +”运算符来连接字符串。 示例 输出结果

  • 问题内容: 我对String串联感到困惑。 输出为: 50abc20 50abc1010 我想知道为什么在两种情况下都将 20 + 30 加在一起,但是 10 + 10 需要加上括号(s1)而不是串联到String(s2)。请在此处说明String运算符的工作方式。 问题答案: 加法保持关联。以第一种情况 在第二种情况下:

  • 问题内容: 我不知道MySQL的串联运算符。 我已尝试将此代码进行串联: 但这没有用。我应该使用哪个运算符来连接字符串? 问题答案: 您正在使用ORACLE类型的串联。MySQL的应该是 调用该函数,并用逗号分隔您的值。

  • 问题内容: 嗨,我只是想知道为什么这段代码(至少对我来说)产生错误的结果。 好吧,我可能在这里错了 我猜想,如果paperType等于“ Bond”,则说明为“ Paper:Bond”,如果paperType不等于“ Bond”,则说明为“ Paper:Other”。 但是,当我运行这段代码时,结果描述是“ Bond”还是“ Other”,让我想知道字符串“ Paper:”去了哪里??? 问题答案