当前位置: 首页 > 知识库问答 >
问题:

如果字符串出现在变量之后,为什么Java编译器不将它们串联起来呢?

施恩
2023-03-14
public class StringLiteralTest {
    static void testPrefix() {
        int i = 0;
        String prefixConcat = "a" + "b" + i;
    }

    static void testSuffix() {
        int i = 0;
        String suffixConcat = i + "c" + "d";
    }
}
Compiled from "StringLiteralTest.java"
public class StringLiteralTest {
  public StringLiteralTest();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  static void testPrefix();
    Code:
       0: iconst_0
       1: istore_0
       2: new           #15                 // class java/lang/StringBuilder
       5: dup
       6: ldc           #17                 // String ab
       8: invokespecial #19                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
      11: iload_0
      12: invokevirtual #22                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      15: invokevirtual #26                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      18: astore_1
      19: return

  static void testSuffix();
    Code:
       0: iconst_0
       1: istore_0
       2: new           #15                 // class java/lang/StringBuilder
       5: dup
       6: iload_0
       7: invokestatic  #35                 // Method java/lang/String.valueOf:(I)Ljava/lang/String;
      10: invokespecial #19                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
      13: ldc           #41                 // String c
      15: invokevirtual #43                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      18: ldc           #46                 // String d
      20: invokevirtual #43                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      23: invokevirtual #26                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      26: astore_1
      27: return
}

为什么编译器不能组合第二种方法中的字符串文字?

源文件是用默认的Oracle JDK8 javac编译的。

共有1个答案

滕学义
2023-03-14

因为字符串级联运算符(+)在语法上是左关联的:

例如,表达式:

a + b + c

总是被视为意思:

(a + b) + c

诚然,如果bc是字符串,则表达式等价于a+(b+c)。因此,编译器可以在特定情况下执行您建议的操作,但这并不是规范所要求的...

 类似资料:
  • 问题内容: 我不明白为什么整数在串联中被视为字符串文字。例如 输出为:。 为什么不添加,为什么要添加? 问题答案: 该表达式从左到右求值。前两个操作数均为(10和30),因此第一个执行加法。 下一个获取操作数(40)和操作数(“ Sachin”),因此将其转换为并执行连接。 接下来的运算符获取一个操作数和一个操作数,并执行级联。 如果您想要不同的评估顺序,请使用括号: 这将输出。

  • 在Python CGI脚本中,我有作为哈希键的字符串列表: Apache日志如实记录: 我很惊讶它似乎在单个字符串上迭代一次(列表的冗余连接),而不是迭代似乎识别为字符串列表的内容,这就是我的意图。 如何让循环通过“CJSHayward”在“Alfresco”、“Bible”等上进行迭代?

  • 问题内容: 有没有办法整合React的花括号符号和标签?假设我们在状态中具有以下值: 以及标签上的以下HTML属性: 有没有一种方法可以将状态添加到HTML属性中以获得类似这样的信息: 这将产生: 问题答案: 您几乎是正确的,只是放了一些引号。用正则引号将整个内容包装起来,就可以从字面上得到字符串-您需要指出哪些是变量,哪些是字符串。由于里面的任何内容都是内联JSX 表达式 ,因此您可以执行以下操

  • 问题内容: 就像标题所说的那样,我正在尝试在Java中将字符串“ test”编码为base32字符串“ ORSXG5A =“。 我在网上搜索时发现的所有类都是使用32位从字符串编码为数组的类,但是显然这不是我想要的。 很抱歉这个新手问题。 问题答案: Apache commons编解码器提供了一个可以执行此操作的类 版画 您可以在此处下载。

  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 问题内容: 他们为什么决定使用 Java和.NET(和其他一些语言)使其不可变?他们为什么不使它可变? 问题答案: 根据Effective Java第四章第73页第2版: “这样做有很多充分的理由:不可变的类比可变的类更易于设计,实现和使用。它们不易出错且更安全。 […] “ 不可变对象很简单。不可变对象可以恰好处于一种状态,即创建时的状态。如果确保所有构造函数都建立类不变式,则可以保证这些不变式