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

Java字符串串联:concat()与“ +”operator

慕容越泽
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。实际上,内存分配出奇的快。



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

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

  • 问题内容: 我正在从事Java代码优化。我不清楚或符号之间的区别: 第2行和第3行有什么区别? 问题答案: 这种方法使用StringBuilder创建结果字符串 此方法仅调用的静态方法来获取int的String版本 依次调用

  • 上面的代码返回false,但是如果我注释掉第1行和第2行,它返回true。为什么会这样?

  • 问题内容: 我看到许多人使用这样的格式字符串: 而不是像这样简单地串联字符串: 格式字符串是否具有更好的性能,还是仅用于外观? 问题答案: 这只是为了外观。您可以一眼看出格式是什么。我们中的许多人都比微优化更喜欢可读性。 让我们看看IPython的意思:

  • 问题内容: 我正在开发一个应用程序,在其中执行一些请求以获取对象ID。在它们每个之后,我调用一个方法()将此id作为参数传递(请参见下面的代码)。 可以注意到,我正在将其转换为前缀并将其与前缀连接。但是,我知道我能做到这一点的多种其他方式(或者,例如),并在我的问题的结果:将超过字符串连接更好的可读性,代码约定和效率方面? 谢谢 问题答案: 这很容易成为基于意见的主题,但是我发现格式在大多数情况下