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
结论:使用$也需要谨慎了
7579

被折叠的 条评论
为什么被折叠?



