Kotlin $字符怎么实现字符串拼接

String, StringBuilder, StringBuffer大家都知道是啥吧

Java中一个String就是一个对象,通过➕拼接会重新构建一个String对象,所以尽量避免在循环中进行String拼接,那怎么进行拼接呢?

StringBuilder拼接时不会构建新String对象,平时一般使用StringBuilder进行拼接即可

有了StringBuilder后,为什么还会出现StringBuffer?因为StringBuilder在多线程下不安全,StringBuffer基础方法都是synchronized的,所以支持多线程下的数据读写操作

@Override
public synchronized StringBuffer append(CharSequence s) {
    toStringCache = null;
    super.append(s);
    return this;
}

了解完Java中的String相关,那Kotlin中一般怎么进行字符串拼接的呢?

看一下,我们拼上都用$进行字符串拼接,那Kotlin内部怎么实现的?

fun main() {
    val a = "a"
    val b = "b"

    val value1 = a + b
    val value2 = "$a $b"
    val value3 = "$a $b."
    val value4 = ".$a $b"
    val value5 = "$a ${b}."

    println(
        "value1=${value1}, "+
        "value2=${value2}, "+
        "value3=${value3}, "+
        "value4=${value4}, "+
        "value5=${value5}, "
    )
}

通过AndroidStudio -> Tools -> Kotlin -> Show Kotlin Bytecode -> Decompile可以看到

Java 8下,使用的是StringBuilder拼接

public final static main()V
   L0
    LINENUMBER 8 L0
    LDC "a"
    ASTORE 0
   L1
    LINENUMBER 9 L1
    LDC "b"
    ASTORE 1
   L2
    LINENUMBER 11 L2
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    ALOAD 0
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 2
   L3
    LINENUMBER 12 L3
    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;
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 3
   L4
    LINENUMBER 13 L4
    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;
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    BIPUSH 46
    INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 4
   L5
    LINENUMBER 14 L5
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    BIPUSH 46
    INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
    ALOAD 0
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    BIPUSH 32
    INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 5
   L6
    LINENUMBER 15 L6
    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;
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    BIPUSH 46
    INVOKEVIRTUAL java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 6
   L7
    LINENUMBER 18 L7
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    LDC "value1="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC ", value2="
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L8
    LINENUMBER 19 L8
    ALOAD 3
   L9
    LINENUMBER 18 L9
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L10
    LINENUMBER 19 L10
    LDC ", value3="
   L11
    LINENUMBER 18 L11
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L12
    LINENUMBER 20 L12
    ALOAD 4
   L13
    LINENUMBER 18 L13
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L14
    LINENUMBER 20 L14
    LDC ", value4="
   L15
    LINENUMBER 18 L15
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L16
    LINENUMBER 21 L16
    ALOAD 5
   L17
    LINENUMBER 18 L17
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L18
    LINENUMBER 21 L18
    LDC ", value5="
   L19
    LINENUMBER 18 L19
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L20
    LINENUMBER 22 L20
    ALOAD 6
   L21
    LINENUMBER 18 L21
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
   L22
    LINENUMBER 22 L22
    LDC ", "
   L23
    LINENUMBER 18 L23
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 7
   L24
    LINENUMBER 17 L24
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 7
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L25
    LINENUMBER 24 L25
    RETURN
   L26
    LOCALVARIABLE a Ljava/lang/String; L1 L26 0
    LOCALVARIABLE b Ljava/lang/String; L2 L26 1
    LOCALVARIABLE value1 Ljava/lang/String; L3 L26 2
    LOCALVARIABLE value2 Ljava/lang/String; L4 L26 3
    LOCALVARIABLE value3 Ljava/lang/String; L5 L26 4
    LOCALVARIABLE value4 Ljava/lang/String; L6 L26 5
    LOCALVARIABLE value5 Ljava/lang/String; L7 L26 6
    MAXSTACK = 2
    MAXLOCALS = 8

Java17下,使用的String拼接

public final static main()V
   L0
    LINENUMBER 8 L0
    LDC "a"
    ASTORE 0
   L1
    LINENUMBER 9 L1
    LDC "b"
    ASTORE 1
   L2
    LINENUMBER 11 L2
    ALOAD 0
    ALOAD 1
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "\u0001\u0001"
    ]
    ASTORE 2
   L3
    LINENUMBER 12 L3
    ALOAD 0
    ALOAD 1
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "\u0001 \u0001"
    ]
    ASTORE 3
   L4
    LINENUMBER 13 L4
    ALOAD 0
    ALOAD 1
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "\u0001 \u0001."
    ]
    ASTORE 4
   L5
    LINENUMBER 14 L5
    ALOAD 0
    ALOAD 1
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      ".\u0001 \u0001"
    ]
    ASTORE 5
   L6
    LINENUMBER 15 L6
    ALOAD 0
    ALOAD 1
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "\u0001 \u0001."
    ]
    ASTORE 6
   L7
    LINENUMBER 18 L7
    ALOAD 2
   L8
    LINENUMBER 19 L8
    ALOAD 3
   L9
    LINENUMBER 20 L9
    ALOAD 4
   L10
    LINENUMBER 21 L10
    ALOAD 5
   L11
    LINENUMBER 22 L11
    ALOAD 6
    INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "value1=\u0001, value2=\u0001, value3=\u0001, value4=\u0001, value5=\u0001, "
    ]
    ASTORE 7
   L12
    LINENUMBER 17 L12
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ALOAD 7
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
   L13
    LINENUMBER 24 L13
    RETURN
   L14
    LOCALVARIABLE a Ljava/lang/String; L1 L14 0
    LOCALVARIABLE b Ljava/lang/String; L2 L14 1
    LOCALVARIABLE value1 Ljava/lang/String; L3 L14 2
    LOCALVARIABLE value2 Ljava/lang/String; L4 L14 3
    LOCALVARIABLE value3 Ljava/lang/String; L5 L14 4
    LOCALVARIABLE value4 Ljava/lang/String; L6 L14 5
    LOCALVARIABLE value5 Ljava/lang/String; L7 L14 6
    MAXSTACK = 5
    MAXLOCALS = 8

结论:使用$也需要谨慎了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值