为什么Kotlin的字符串插值在Java中串联字符串?
所以,基本上我想知道Kotlin的字符串插值如何看Java(反编译的字节码)。 起初我以为它会使用StringBuffer(或StringBuilder)或String.format(),但它似乎是串联。 这样做真的是最佳吗?字符串池呢?
这是我的Kotlin代码:
fun main(args: Array) { val age : Int = 24 var mySuperString : String = "Dato is ${age} years old!" println(mySuperString) }
这里是我反编译的Java代码forms* .class文件:
import java.io.PrintStream; import kotlin.Metadata; import kotlin.jvm.internal.Intrinsics; import org.jetbrains.annotations.NotNull; @Metadata(mv={1, 1, 6}, bv={1, 0, 1}, k=2, d1={"\000\024\n\000\n\002\020\002\n\000\n\002\020\021\n\002\020\016\n\002\b\002\032\031\020\000\032\0020\0012\f\020\002\032\b\022\004\022\0020\0040\003 \006\002\020\005 \006\006"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "KotlinProject"}) public final class MainKt { public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args");int age = 24; String mySuperString = "Dato is " + age + " years old!"; System.out.println(mySuperString); } }
即使当字符串很大,价值很多,它仍然使用加号!
这是最快的方式,或者他们为什么这样做?
答案很简单:没有
我想你的反编译器是相当复杂的,并且将StringBuilder
-append操作转换为旧版本的合并。
所以如果你看看字节码,你会发现使用了StringBuilder
。
public main(java.lang.String[] arg0) { //([Ljava/lang/String;)V L4 { aload1 ldc "args" (java.lang.String) invokestatic kotlin/jvm/internal/Intrinsics checkParameterIsNotNull((Ljava/lang/Object;Ljava/lang/String;)V); } L5 { bipush 24 istore2 } L3 { new java/lang/StringBuilder dup invokespecial java/lang/StringBuilder (()V); ldc "Dato is " (java.lang.String) invokevirtual java/lang/StringBuilder append((Ljava/lang/String;)Ljava/lang/StringBuilder;); iload2 invokevirtual java/lang/StringBuilder append((I)Ljava/lang/StringBuilder;); ldc " years old!" (java.lang.String) invokevirtual java/lang/StringBuilder append((Ljava/lang/String;)Ljava/lang/StringBuilder;); invokevirtual java/lang/StringBuilder toString(()Ljava/lang/String;); astore3 } L1 { getstatic java/lang/System.out:java.io.PrintStream aload3 invokevirtual java/io/PrintStream println((Ljava/lang/Object;)V); } L6 { return } L2 { } }
- (已解决)Bugsnag w / Spring(Kotlin / Java):没有收到任何错误报告
- Kotlin Higher Order Function以可变数量的参数作为parameter passing一个函数
- Android Dalvik上可以使用哪些编程语言?
- Realm&Kotlin访问字段的变量
- 在org.gradle.testing.jacoco.plugins.JacocoPluginExtension_Decorated找不到属性’run’
- 如何创建Android Facebook密钥哈希?
- Java将特定类的列表添加到java.lang.Object列表中,与java 8 streams一起工作 – 为什么?
- Kotlin / Java,字符串数组尚未在方法调用时初始化
- com.google.gson.internal.LinkedTreeMap不能转换为我的类
- 在Kotlin注释不起作用
- Kotlin对象和伴侣对象如何与懒惰一起工作的内存