package com.tech.constantpool;
public class Demo_3 {
public static void main(String[] args) {
String s1="a";
String s2="b";
String s3="ab";
String s4=s1+s2;
System.out.println(s3==s4);
}
}
这段代码运行结果为:false
使用javap查询二进制字节码文件
D:Techcodetech-jvmtargetclassescomtechconstantpool>javap -v D:Techcodetech-jvmtargetclassescomtechconstantpoolDemo_3.c lass Classfile /D:/Tech/code/tech-jvm/target/classes/com/tech/constantpool/Demo_3.class Last modified 2021-10-26; size 936 bytes MD5 checksum 239d368d77e3e5039a20cf0b5dcffd03 Compiled from "Demo_3.java" public class com.tech.constantpool.Demo_3 minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #12.#35 // java/lang/Object."":()V #2 = String #36 // a #3 = String #37 // b #4 = String #38 // ab #5 = Class #39 // java/lang/StringBuilder #6 = Methodref #5.#35 // java/lang/StringBuilder." ":()V #7 = Methodref #5.#40 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; #8 = Methodref #5.#41 // java/lang/StringBuilder.toString:()Ljava/lang/String; #9 = Fieldref #42.#43 // java/lang/System.out:Ljava/io/PrintStream; #10 = Methodref #44.#45 // java/io/PrintStream.println:(Z)V #11 = Class #46 // com/tech/constantpool/Demo_3 #12 = Class #47 // java/lang/Object #13 = Utf8 #14 = Utf8 ()V #15 = Utf8 Code #16 = Utf8 LineNumberTable #17 = Utf8 LocalVariableTable #18 = Utf8 this #19 = Utf8 Lcom/tech/constantpool/Demo_3; #20 = Utf8 main #21 = Utf8 ([Ljava/lang/String;)V #22 = Utf8 args #23 = Utf8 [Ljava/lang/String; #24 = Utf8 s1 #25 = Utf8 Ljava/lang/String; #26 = Utf8 s2 #27 = Utf8 s3 #28 = Utf8 s4 #29 = Utf8 StackMapTable #30 = Class #23 // "[Ljava/lang/String;" #31 = Class #48 // java/lang/String #32 = Class #49 // java/io/PrintStream #33 = Utf8 SourceFile #34 = Utf8 Demo_3.java #35 = NameAndType #13:#14 // " ":()V #36 = Utf8 a #37 = Utf8 b #38 = Utf8 ab #39 = Utf8 java/lang/StringBuilder #40 = NameAndType #50:#51 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder; #41 = NameAndType #52:#53 // toString:()Ljava/lang/String; #42 = Class #54 // java/lang/System #43 = NameAndType #55:#56 // out:Ljava/io/PrintStream; #44 = Class #49 // java/io/PrintStream #45 = NameAndType #57:#58 // println:(Z)V #46 = Utf8 com/tech/constantpool/Demo_3 #47 = Utf8 java/lang/Object #48 = Utf8 java/lang/String #49 = Utf8 java/io/PrintStream #50 = Utf8 append #51 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder; #52 = Utf8 toString #53 = Utf8 ()Ljava/lang/String; #54 = Utf8 java/lang/System #55 = Utf8 out #56 = Utf8 Ljava/io/PrintStream; #57 = Utf8 println #58 = Utf8 (Z)V { public com.tech.constantpool.Demo_3(); 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 7: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/tech/constantpool/Demo_3; public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=5, args_size=1 0: ldc #2 // String a 2: astore_1 3: ldc #3 // String b 5: astore_2 6: ldc #4 // String ab 8: astore_3 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: aload_2 21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 24: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 27: astore 4 29: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream; 32: aload_3 33: aload 4 35: if_acmpne 42 38: iconst_1 39: goto 43 42: iconst_0 43: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V 46: return LineNumberTable: line 9: 0 line 10: 3 line 11: 6 line 12: 9 line 13: 29 line 14: 46 LocalVariableTable: Start Length Slot Name Signature 0 47 0 args [Ljava/lang/String; 3 44 1 s1 Ljava/lang/String; 6 41 2 s2 Ljava/lang/String; 9 38 3 s3 Ljava/lang/String; 29 18 4 s4 Ljava/lang/String; StackMapTable: number_of_entries = 2 frame_type = 255 offset_delta = 42 locals = [ class "[Ljava/lang/String;", class java/lang/String, class java/lang/String, class java/lang/String, class java/la ng/String ] stack = [ class java/io/PrintStream ] frame_type = 255 offset_delta = 0 locals = [ class "[Ljava/lang/String;", class java/lang/String, class java/lang/String, class java/lang/String, class java/la ng/String ] stack = [ class java/io/PrintStream, int ] } SourceFile: "Demo_3.java"
String s4=s1+s2;执行过程 new1个StringBuilder; 调用构造器; load出s1的值; 调用append; load出s2的值; 调用append; 调用toString;
# StringBuilder的toString方法
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
用到了new来新创建对象,新创建的对象保存在堆内存中。
一个是保存在串池中一个是保存在堆内存中,因此判断相等为false。



