String与常量池

这一篇主要还是记录一下String 对象的创建,通过一个个小例子总结一下

        String a = "1";
        String b = "1";

        System.out.println(a == b);

这个 a 和 b 取的都是 Constant pool 常量池,我们用javac看一下字节码文件。

javap -v StringJson 的执行结果,可以看到 String 1 取的都是 Constant pool 里的#2, 那程序的执行结果也很明确了, 为true。

public class com.zhangmen.redis.StringJson
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#19         // java/lang/Object."":()V
   #2 = String             #20            // 1
   #3 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #23.#24        // java/io/PrintStream.println:(Z)V
   #5 = Class              #25            // com/zhangmen/redis/StringJson
   #6 = Class              #26            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               StackMapTable
  #14 = Class              #27            // "[Ljava/lang/String;"
  #15 = Class              #28            // java/lang/String
  #16 = Class              #29            // java/io/PrintStream
  #17 = Utf8               SourceFile
  #18 = Utf8               StringJson.java
  #19 = NameAndType        #7:#8          // "":()V
  #20 = Utf8               1
  #21 = Class              #30            // java/lang/System
  #22 = NameAndType        #31:#32        // out:Ljava/io/PrintStream;
  #23 = Class              #29            // java/io/PrintStream
  #24 = NameAndType        #33:#34        // println:(Z)V
  #25 = Utf8               com/zhangmen/redis/StringJson
  #26 = Utf8               java/lang/Object
  #27 = Utf8               [Ljava/lang/String;
  #28 = Utf8               java/lang/String
  #29 = Utf8               java/io/PrintStream
  #30 = Utf8               java/lang/System
  #31 = Utf8               out
  #32 = Utf8               Ljava/io/PrintStream;
  #33 = Utf8               println
  #34 = Utf8               (Z)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: ldc           #2                  // String 1
         2: astore_1
         3: ldc           #2                  // String 1
         5: astore_2
         6: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         9: aload_1
        10: aload_2
        11: if_acmpne     18
        14: iconst_1
        15: goto          19
        18: iconst_0
        19: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
        22: return
      LineNumberTable:

=================================== 分割线 =============================

        final String a = "1";
        String b = "1";

        System.out.println(a == b);

一个变量加了final,但是字节码看来的结果还是一样,都是放入 Constant pool 里的 #2 ,结果认为true

public class com.zhangmen.redis.StringJson
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#19         // java/lang/Object."":()V
   #2 = String             #20            // 1
   #3 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #23.#24        // java/io/PrintStream.println:(Z)V
   #5 = Class              #25            // com/zhangmen/redis/StringJson
   #6 = Class              #26            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               StackMapTable
  #14 = Class              #27            // "[Ljava/lang/String;"
  #15 = Class              #28            // java/lang/String
  #16 = Class              #29            // java/io/PrintStream
  #17 = Utf8               SourceFile
  #18 = Utf8               StringJson.java
  #19 = NameAndType        #7:#8          // "":()V
  #20 = Utf8               1
  #21 = Class              #30            // java/lang/System
  #22 = NameAndType        #31:#32        // out:Ljava/io/PrintStream;
  #23 = Class              #29            // java/io/PrintStream
  #24 = NameAndType        #33:#34        // println:(Z)V
  #25 = Utf8               com/zhangmen/redis/StringJson
  #26 = Utf8               java/lang/Object
  #27 = Utf8               [Ljava/lang/String;
  #28 = Utf8               java/lang/String
  #29 = Utf8               java/io/PrintStream
  #30 = Utf8               java/lang/System
  #31 = Utf8               out
  #32 = Utf8               Ljava/io/PrintStream;
  #33 = Utf8               println
  #34 = Utf8               (Z)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: ldc           #2                  // String 1
         2: astore_2
         3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         6: ldc           #2                  // String 1
         8: aload_2
         9: if_acmpne     16
        12: iconst_1
        13: goto          17
        16: iconst_0
        17: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
        20: return
      LineNumberTable:

=================================== 分割线 =============================

        final String a = "1";
        final String b = "2";

        System.out.println(a + b);

两个变量都加了final,然后两个final相加,字节码展示 只有 Constant pool 只有一个 #18 12 的数字 ,说明jvm会将两个final合成一个。

public class com.zhangmen.redis.StringJson
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #6.#15         // java/lang/Object."":()V
   #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #18            // 12
   #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #21            // com/zhangmen/redis/StringJson
   #6 = Class              #22            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               StringJson.java
  #15 = NameAndType        #7:#8          // "":()V
  #16 = Class              #23            // java/lang/System
  #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
  #18 = Utf8               12
  #19 = Class              #26            // java/io/PrintStream
  #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
  #21 = Utf8               com/zhangmen/redis/StringJson
  #22 = Utf8               java/lang/Object
  #23 = Utf8               java/lang/System
  #24 = Utf8               out
  #25 = Utf8               Ljava/io/PrintStream;
  #26 = Utf8               java/io/PrintStream
  #27 = Utf8               println
  #28 = Utf8               (Ljava/lang/String;)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #3                  // String 12
         5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 11: 0
        line 12: 8
}

=================================== 分割线 =============================

        String a = "1";
        String b = "2";

        String c = "12";


        System.out.println(a + b == c);

这次加大难度,通过前面的例子,可以推测出 Constant pool 有三个变量 1 ,2 ,12 . a与b相加 实际是 StringBuilder相加,所以 StringBuilder相加出来的字符串不等于 c,执行为false

Constant pool:
   #1 = Methodref          #12.#25        // java/lang/Object."":()V
   #2 = String             #26            // 1
   #3 = String             #27            // 2
   #4 = String             #28            // 12
   #5 = Fieldref           #29.#30        // java/lang/System.out:Ljava/io/PrintStream;
   #6 = Class              #31            // java/lang/StringBuilder
   #7 = Methodref          #6.#25         // java/lang/StringBuilder."":()V
   #8 = Methodref          #6.#32         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #9 = Methodref          #6.#33         // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #10 = Methodref          #34.#35        // java/io/PrintStream.println:(Z)V
  #11 = Class              #36            // com/zhangmen/redis/StringJson
  #12 = Class              #37            // java/lang/Object
  #13 = Utf8               <init>
  #14 = Utf8               ()V
  #15 = Utf8               Code
  #16 = Utf8               LineNumberTable
  #17 = Utf8               main
  #18 = Utf8               ([Ljava/lang/String;)V
  #19 = Utf8               StackMapTable
  #20 = Class              #38            // "[Ljava/lang/String;"
  #21 = Class              #39            // java/lang/String
  #22 = Class              #40            // java/io/PrintStream
  #23 = Utf8               SourceFile
  #24 = Utf8               StringJson.java
  #25 = NameAndType        #13:#14        // "":()V
  #26 = Utf8               1
  #27 = Utf8               2
  #28 = Utf8               12
  #29 = Class              #41            // java/lang/System
  #30 = NameAndType        #42:#43        // out:Ljava/io/PrintStream;
  #31 = Utf8               java/lang/StringBuilder
  #32 = NameAndType        #44:#45        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #33 = NameAndType        #46:#47        // toString:()Ljava/lang/String;
  #34 = Class              #40            // java/io/PrintStream
  #35 = NameAndType        #48:#49        // println:(Z)V
  #36 = Utf8               com/zhangmen/redis/StringJson
  #37 = Utf8               java/lang/Object
  #38 = Utf8               [Ljava/lang/String;
  #39 = Utf8               java/lang/String
  #40 = Utf8               java/io/PrintStream
  #41 = Utf8               java/lang/System
  #42 = Utf8               out
  #43 = Utf8               Ljava/io/PrintStream;
  #44 = Utf8               append
  #45 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #46 = Utf8               toString
  #47 = Utf8               ()Ljava/lang/String;
  #48 = Utf8               println
  #49 = Utf8               (Z)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
         0: ldc           #2                  // String 1
         2: astore_1
         3: ldc           #3                  // String 2
         5: astore_2
         6: ldc           #4                  // String 12
         8: astore_3
         9: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
        12: new           #6                  // class java/lang/StringBuilder
        15: dup
        16: invokespecial #7                  // Method java/lang/StringBuilder."":()V
        19: aload_1
        20: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        23: aload_2
        24: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        27: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        30: aload_3
        31: if_acmpne     38
        34: iconst_1
        35: goto          39
        38: iconst_0
        39: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
        42: return
      LineNumberTable:

=================================== 分割线 =============================

        String a = "1";
        String b = "2";

        String c = "12";


        System.out.println((a + b).intern() == c);

但是这一次 我用 (a + b).intern(),intern是干嘛的?可以看方法的源码,大意就是当方法执行时,如果Constant pool已经有相同内容的字符串(通过equals(Object)方法比对),就直接返回pool里面的字符串; 如果没有,就先放进Constant pool,然后返回pool里面的字符串。所以,这个程序我们知道 程序执行必为true。

java.lang.String @NotNull 
public String intern()
Returns a canonical representation for the string object.
A pool of strings, initially empty, is maintained privately by the class String.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
All literal strings and string-valued constant expressions are interned. String literals are defined in section 3.10.5 of the The Java™ Language Specification.
Constant pool:
   #1 = Methodref          #13.#26        // java/lang/Object."":()V
   #2 = String             #27            // 1
   #3 = String             #28            // 2
   #4 = String             #29            // 12
   #5 = Fieldref           #30.#31        // java/lang/System.out:Ljava/io/PrintStream;
   #6 = Class              #32            // java/lang/StringBuilder
   #7 = Methodref          #6.#26         // java/lang/StringBuilder."":()V
   #8 = Methodref          #6.#33         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #9 = Methodref          #6.#34         // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #10 = Methodref          #35.#36        // java/lang/String.intern:()Ljava/lang/String;
  #11 = Methodref          #37.#38        // java/io/PrintStream.println:(Z)V
  #12 = Class              #39            // com/zhangmen/redis/StringJson
  #13 = Class              #40            // java/lang/Object
  #14 = Utf8               <init>
  #15 = Utf8               ()V
  #16 = Utf8               Code
  #17 = Utf8               LineNumberTable
  #18 = Utf8               main
  #19 = Utf8               ([Ljava/lang/String;)V
  #20 = Utf8               StackMapTable
  #21 = Class              #41            // "[Ljava/lang/String;"
  #22 = Class              #42            // java/lang/String
  #23 = Class              #43            // java/io/PrintStream
  #24 = Utf8               SourceFile
  #25 = Utf8               StringJson.java
  #26 = NameAndType        #14:#15        // "":()V
  #27 = Utf8               1
  #28 = Utf8               2
  #29 = Utf8               12
  #30 = Class              #44            // java/lang/System
  #31 = NameAndType        #45:#46        // out:Ljava/io/PrintStream;
  #32 = Utf8               java/lang/StringBuilder
  #33 = NameAndType        #47:#48        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #34 = NameAndType        #49:#50        // toString:()Ljava/lang/String;
  #35 = Class              #42            // java/lang/String
  #36 = NameAndType        #51:#50        // intern:()Ljava/lang/String;
  #37 = Class              #43            // java/io/PrintStream
  #38 = NameAndType        #52:#53        // println:(Z)V
  #39 = Utf8               com/zhangmen/redis/StringJson
  #40 = Utf8               java/lang/Object
  #41 = Utf8               [Ljava/lang/String;
  #42 = Utf8               java/lang/String
  #43 = Utf8               java/io/PrintStream
  #44 = Utf8               java/lang/System
  #45 = Utf8               out
  #46 = Utf8               Ljava/io/PrintStream;
  #47 = Utf8               append
  #48 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #49 = Utf8               toString
  #50 = Utf8               ()Ljava/lang/String;
  #51 = Utf8               intern
  #52 = Utf8               println
  #53 = Utf8               (Z)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
         0: ldc           #2                  // String 1
         2: astore_1
         3: ldc           #3                  // String 2
         5: astore_2
         6: ldc           #4                  // String 12
         8: astore_3
         9: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
        12: new           #6                  // class java/lang/StringBuilder
        15: dup
        16: invokespecial #7                  // Method java/lang/StringBuilder."":()V
        19: aload_1
        20: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        23: aload_2
        24: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        27: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        30: invokevirtual #10                 // Method java/lang/String.intern:()Ljava/lang/String;
        33: aload_3
        34: if_acmpne     41
        37: iconst_1
        38: goto          42
        41: iconst_0
        42: invokevirtual #11                 // Method java/io/PrintStream.println:(Z)V
        45: return
      LineNumberTable:

=================================== 分割线 =============================

        final String a = "1";
        final String b = "2";

        String c = "12";


        System.out.println((a + b) == c);

送分题,前面说了 两个final java会在 Constant pool 合并成一个 常量,那么c也是Constant pool 里的常量,所以为true

Constant pool:
   #1 = Methodref          #6.#19         // java/lang/Object."":()V
   #2 = String             #20            // 12
   #3 = Fieldref           #21.#22        // java/lang/System.out:Ljava/io/PrintStream;
   #4 = Methodref          #23.#24        // java/io/PrintStream.println:(Z)V
   #5 = Class              #25            // com/zhangmen/redis/StringJson
   #6 = Class              #26            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               StackMapTable
  #14 = Class              #27            // "[Ljava/lang/String;"
  #15 = Class              #28            // java/lang/String
  #16 = Class              #29            // java/io/PrintStream
  #17 = Utf8               SourceFile
  #18 = Utf8               StringJson.java
  #19 = NameAndType        #7:#8          // "":()V
  #20 = Utf8               12
  #21 = Class              #30            // java/lang/System
  #22 = NameAndType        #31:#32        // out:Ljava/io/PrintStream;
  #23 = Class              #29            // java/io/PrintStream
  #24 = NameAndType        #33:#34        // println:(Z)V
  #25 = Utf8               com/zhangmen/redis/StringJson
  #26 = Utf8               java/lang/Object
  #27 = Utf8               [Ljava/lang/String;
  #28 = Utf8               java/lang/String
  #29 = Utf8               java/io/PrintStream
  #30 = Utf8               java/lang/System
  #31 = Utf8               out
  #32 = Utf8               Ljava/io/PrintStream;
  #33 = Utf8               println
  #34 = Utf8               (Z)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
         0: ldc           #2                  // String 12
         2: astore_3
         3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
         6: ldc           #2                  // String 12
         8: aload_3
         9: if_acmpne     16
        12: iconst_1
        13: goto          17
        16: iconst_0
        17: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
        20: return
      LineNumberTable:

=================================== 分割线 =============================

        final String a = "1";
        String b = "2";

        String c = "12";


        System.out.println((a + b) == c);

少了一个final,final + 非 final变量 仍使用 StringBuilder 连接,跟 Constant pool里的12仍是两个东西。

 Constant pool:
   #1 = Methodref          #12.#25        // java/lang/Object."":()V
   #2 = String             #26            // 1
   #3 = String             #27            // 12
   #4 = Fieldref           #28.#29        // java/lang/System.out:Ljava/io/PrintStream;
   #5 = Class              #30            // java/lang/StringBuilder
   #6 = Methodref          #5.#25         // java/lang/StringBuilder."":()V
   #7 = Methodref          #5.#31         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   #8 = String             #32            // 2
   #9 = Methodref          #5.#33         // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #10 = Methodref          #34.#35        // java/io/PrintStream.println:(Z)V
  #11 = Class              #36            // com/zhangmen/redis/StringJson
  #12 = Class              #37            // java/lang/Object
  #13 = Utf8               <init>
  #14 = Utf8               ()V
  #15 = Utf8               Code
  #16 = Utf8               LineNumberTable
  #17 = Utf8               main
  #18 = Utf8               ([Ljava/lang/String;)V
  #19 = Utf8               StackMapTable
  #20 = Class              #38            // "[Ljava/lang/String;"
  #21 = Class              #39            // java/lang/String
  #22 = Class              #40            // java/io/PrintStream
  #23 = Utf8               SourceFile
  #24 = Utf8               StringJson.java
  #25 = NameAndType        #13:#14        // "":()V
  #26 = Utf8               1
  #27 = Utf8               12
  #28 = Class              #41            // java/lang/System
  #29 = NameAndType        #42:#43        // out:Ljava/io/PrintStream;
  #30 = Utf8               java/lang/StringBuilder
  #31 = NameAndType        #44:#45        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #32 = Utf8               2
  #33 = NameAndType        #46:#47        // toString:()Ljava/lang/String;
  #34 = Class              #40            // java/io/PrintStream
  #35 = NameAndType        #48:#49        // println:(Z)V
  #36 = Utf8               com/zhangmen/redis/StringJson
  #37 = Utf8               java/lang/Object
  #38 = Utf8               [Ljava/lang/String;
  #39 = Utf8               java/lang/String
  #40 = Utf8               java/io/PrintStream
  #41 = Utf8               java/lang/System
  #42 = Utf8               out
  #43 = Utf8               Ljava/io/PrintStream;
  #44 = Utf8               append
  #45 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #46 = Utf8               toString
  #47 = Utf8               ()Ljava/lang/String;
  #48 = Utf8               println
  #49 = Utf8               (Z)V
{
  public com.zhangmen.redis.StringJson();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 4: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=4, args_size=1
         0: ldc           #2                  // String 1
         2: astore_1
         3: ldc           #3                  // String 12
         5: astore_3
         6: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
         9: new           #5                  // class java/lang/StringBuilder
        12: dup
        13: invokespecial #6                  // Method java/lang/StringBuilder."":()V
        16: aload_1
        17: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        20: ldc           #8                  // String 2
        22: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        25: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        28: aload_3
        29: if_acmpne     36
        32: iconst_1
        33: goto          37
        36: iconst_0
        37: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
        40: return
      LineNumberTable:

你可能感兴趣的:(JVM)