【问题标题】:Concatenation of two Java strings [duplicate]两个Java字符串的连接[重复]
【发布时间】:2014-05-20 02:57:54
【问题描述】:
  1. 当我写下面的代码时

    int a = "Java";
    

    java 编译器显示以下错误:

    无法从 String 转换为 int

    所以常量Java被认为是一个派生自 String 班级。

    -""之间包含的每个字符列表是否都被视为从String类派生的对象?

  2. 当我尝试连接两个字符串时,我使用了两个 以下示例:

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    

    在我的编译类上使用命令javap -c 后,我发现 编译器使用StringBuilder 的实例来附加 两个字符串。

    但在另一个例子中:

    String ch = "Java " + "is cool"; 
    

    虽然“Java”和“很酷”这两个常量都是从String派生的两个对象 类,编译器不使用StringBuilder 的实例 附加两个字符串。

    -那么第二个例子中使用的方法是什么?

【问题讨论】:

标签: java string concatenation


【解决方案1】:

From here.

'+' 每次连接某些东西时都会创建一个新的 String 对象,除非在编译时完成连接。

虽然这不是一个有信誉的来源,但根据我从教科书中的记忆来看,这听起来是正确的。所以基本上,将其应用于您的代码:

String ch = "Java " + "is cool";

将在编译时处理,因为您已经定义了两个常量并将它们连接在一起,这意味着结果实际上也是一个常量,因此可以这样处理并在编译时计算。看看您是否编译了该代码然后反编译以查看该语句的读取方式会很有趣,我想它可能会读取:

String ch = "Java is cool";

至于其他说法:

String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;

由于 ch3 是根据 ch1 和 ch2 计算得出的,因此它是在运行时完成的,因为 ch1 和 ch2 是变量而不是常量。

至于你的第一个问题,我找不到任何确切的引用,但据我记得是的,“”表示一个字符串,就像 '' 表示一个字符。我不太确定你想用那个语句做什么,但我想你可以把你的字符串转换成一个 char 数组,然后把它转换成一个 int 数组。

【讨论】:

  • 谢谢你的回答真的很有帮助。
  • @NarutoBijuMode 很高兴我能帮上忙。我不确定那里的一切是否完全清楚。
  • 事实上,我喜欢技术含量不高的答案。谢谢:)
【解决方案2】:

不确定您的第二个问题是什么,但对于您的第一个问题: “Java”是一个字符串,您正试图将其存储为 int 类型。它不是整数。变量 a 必须是字符串类型。

   String a = "Java ";

【讨论】:

  • 是的,我明确错误检查常量“Java”的性质
  • 对我来说还是有点不清楚,但是是的,一旦你输入“某物”,它就会认为某物是字符串类型的。不过,您始终可以声明一个单独的整数并使用 Integer.parseInt() 从该字符串中获取一个整数。
  • 我真正的问题是为什么java编译器不使用StringBuilderString ch = "Java " + "is cool";
【解决方案3】:

在第一个示例中,您创建了 2 个字符串 vars,ch1 和 ch2,它们可用于代码的其他部分,所以...当您初始化 ch3 时,会在内存中创建一个包含两个 vars 内容的新字符串(此处为是 StringBuilder 工作的地方)。这是必需的,因为您可以更改 ch2 的值,而 ch3 不会更改。

在第二个示例中,两个字符串都是最终的,并且不再在代码中进一步使用,因此 Java 只需创建一个唯一的字符串“Java is cool”。

不知道有没有解释清楚。

【讨论】:

    【解决方案4】:

    当你执行以下行时

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    

    ch1 和 ch2 都是文字,编译器将使用 StringBuilder 创建 String 实例。在早期(当编译器不够聪明时)我们会通过 concat 操作为每次执行浪费内存

    但是当你使用这个时

    String ch = "Java " + "is cool";
    

    编译器明白 String Literal "Java" + "iscool" 不能随时修改。所以编译器会把它翻译成

    String ch = "Java is cool";
    

    作为字节码。并且只有一个字符串文字会创建运行时间。

    【讨论】:

    • 谢谢,您的回答解释了我的第二个问题。但是在我的第一部分中,您能否确认我是否“"" 之间包含的每个字符列表是否都被视为从 String 类派生的对象?”是真是假?
    • 请通过这个答案stackoverflow.com/a/3297900/2182351。 "" 之间的字符序列在 Java 中被视为字符串文字。这些文字存储在 JVM 维护的字符串池中。因此,如果您在多个地方有“Java”。您只能在“字符串实例”中使用值(“Java”)并由 JVM 维护。
    猜你喜欢
    • 2015-07-31
    • 2019-10-23
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多