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

Kotlin-字符串插值$vs使用加号等于串联=

西门智
2023-03-14

问题很简单:这2个版本之间有什么区别(都初始化了var name: Stringval thingInt: Int)?

name=“$someInt”

name=“$name$someInt”

我还了解到字符串插值使用StringBuilder,因此第二个代码应该优先于第一个代码(使用串联)?

共有2个答案

金阳华
2023-03-14

语义学是等价的,第二个可能稍微更有效,但并不完全是因为你给出的原因:只有一个连接而不是两个。(第一个首先生成""某个Int,然后生成name("某个Int)。)

翁宏茂
2023-03-14

找到差异的最佳方法是查看生成的字节码(我将使用Kotlin 1.4.10)。

为以下对象生成的字节码:

ALOAD 0
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
SWAP
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
BIPUSH 32
INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
ILOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 0

为以下对象生成的字节码:

NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 0
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
BIPUSH 32
INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
ILOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 0

结果几乎相同,但在第一种情况下有一个额外的SWAP操作,导致第一个append操作的参数过早加载到堆栈上(在StringBuilder创建之前,现在需要交换它们)。

太长别读

结果表明:

  1. 在这两种情况下都会创建StringBuilder
  2. 有3个附录(名称),空白

 类似资料:
  • 问题内容: String s1 = “andrei”; String s2 = “andrei”; 提供以下代码,为什么第二个比较s2 == s3为true?s2.toString()返回的实际上是什么?实际位于哪里? 问题答案: 首先是无操作: 其次,对String常量进行了插值,因此s1和s2在幕后被更改为相同的String实例。

  • 问题内容: String[] letters = {“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “L”}; 为什么是 Fk呀! 输入AL字母之一绝对不会发生? 问题答案: 字符串是对象。所述通过引用,而不是由它们的内部值进行比较的对象。 有两种解决方案: 使用method来比较两个对象的值。 使用代替。这是原始的,因此可以使用。

  • 问题内容: 我试图理解字符串比较与字符串比较的输出。需要明确的是,我拥有使用==和equals比较两个字符串的类。我试图将==和equals()的输出合并为字符串。equals()的输出会连续显示,但==的输出不会 连续显示。使用Java的装箱功能,将与字符串连接的布尔值联系起来。equals和==都返回布尔值。那么为什么会有这种差异呢?有人可以解释吗? 输出 更新:答案 如果不使用s1 == s

  • 本文向大家介绍groovy 双引号字符串(插值),包括了groovy 双引号字符串(插值)的使用技巧和注意事项,需要的朋友参考一下 示例 默认情况下会急切解析该参数,这意味着适用: 为了在每次使用字符串时延迟加载参数,可以这样做:            

  • 问题 你想创建一个字符串,让它包含体现某个 CoffeeScript 变量的文本。 解决方案 使用 CoffeeScript 中类似 Ruby 的字符串插值,而不是 JavaScript 的字符串拼接。 插值: muppet = "Beeker" favorite = "My favorite muppet is #{muppet}!" # => "My favorite muppet is B

  • 问题内容: 可能是我正在分裂头发,但我想知道以下情况: 最好使用哪个? 我最好的意思是 任何方式 。 阅读这些内容后,其他帖子说案例3并不是最佳性能,其他案例1会以案例3结束,依此类推。 更具体。 例如,搁置一旁,如果必须维护他的代码,哪种风格更适合从其他程序员那里看到呢? 还是您认为哪种编程更有效? 否则您会认为速度更快等。 我不知道该如何表达。 像案例3这样的答案可能会更快,但是绝大多数程序员