2017-08-29 15 views
4

基本的に私はKotlinの文字列補間がJava(デコンパイルされたバイトコード)でどのように見えるか疑問に思っています。最初は、StringBuffer(またはStringBuilder)、またはString.format()を使用すると思っていましたが、連結を行っているようです。それは本当に最適なのですか?ストリングプールはどうですか?ここでKotlinの文字列補間がJavaで文字列を連結するのはなぜですか?

は私Kotlinコードです:文字列が巨大であり、値がされている場合でも

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); 
    } 
} 

fun main(args: Array<String>) { 

    val age : Int = 24 
    var mySuperString : String = "Dato is ${age} years old!" 

    println(mySuperString) 
} 

そして、ここでは、私は、フォーム*の.classファイルを逆コンパイルしましたJavaコードであります多く、それはまだプラス記号を使用しています!

これが最速の方法ですか、なぜこれを行うのですか?

+0

デコンパイル済みコード=バイトコードとは誰ですか? –

+0

@AbhijitSarkarだから私は間違っていた。バイトコードでは1つの文字列かもしれませんが、逆コンパイルするとプラス記号になりますか?ああ、O.K。たぶんそれはそうだ。 – user218046

答えて

9

答えは簡単です:それは私はあなたの逆コンパイラはかなり洗練されても古き良き+ concationationにStringBuilder -append操作を変換推測

ません。

バイトコードを見ると、StringBuilderが使用されています。

public main(java.lang.String[] arg0) { //([Ljava/lang/String;)V 
    <localVar:index=3 , name=mySuperString , desc=Ljava/lang/String;, sig=null, start=L1, end=L2> 
    <localVar:index=2 , name=age , desc=I, sig=null, start=L3, end=L2> 
    <localVar:index=0 , name=this , desc=Lorg/guenhter/springboot/kt/RandomReceivingController;, sig=null, start=L4, end=L2> 
    <localVar:index=1 , name=args , desc=[Ljava/lang/String;, sig=null, start=L4, end=L2> 

    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 <init>(()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 { 
    } 
}