jvm深入理解-各种池
本文章基于jdk版本1.8
1、class常量池(constant pool)
class常量池可以理解为class文件的资源仓库,class文件包含类版本信息、字段、方法、接口等描述信息以及class常量池,class常量池存放class文件在运行期间编译的各种字面量和符号引用。

使用javap -v SkuOperateLogVo.class查看class文件
Classfile /E:/idea_ry/crpcg-s2c-oms/oms-api/target/classes/com/imall/s2c/log/vo/SkuOperateLogVo.class Last modified 2023-4-11; size 3072 bytes MD5 checksum ac45ff782809766249c77db53fa08acd Compiled from "SkuOperateLogVo.java" public class com.imall.s2c.log.vo.SkuOperateLogVo minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #24.#85 // java/lang/Object."<init>":()V #2 = Fieldref #6.#86 // com/imall/s2c/log/vo/SkuOperateLogVo.operator:Ljava/lang/String; #3 = Fieldref #6.#87 // com/imall/s2c/log/vo/SkuOperateLogVo.skuId:Ljava/lang/Long; #4 = Fieldref #6.#88 // com/imall/s2c/log/vo/SkuOperateLogVo.operateContent:Ljava/lang/S tring; #5 = Fieldref #6.#89 // com/imall/s2c/log/vo/SkuOperateLogVo.createTime:Ljava/lang/Strin g; #6 = Class #90 // com/imall/s2c/log/vo/SkuOperateLogVo #7 = Methodref #6.#91 // com/imall/s2c/log/vo/SkuOperateLogVo.canEqual:(Ljava/lang/Object ;)Z #8 = Methodref #6.#92 // com/imall/s2c/log/vo/SkuOperateLogVo.getOperator:()Ljava/lang/St ring; #9 = Methodref #24.#93 // java/lang/Object.equals:(Ljava/lang/Object;)Z #10 = Methodref #6.#94 // com/imall/s2c/log/vo/SkuOperateLogVo.getSkuId:()Ljava/lang/Long; #11 = Methodref #6.#95 // com/imall/s2c/log/vo/SkuOperateLogVo.getOperateContent:()Ljava/l ang/String; #12 = Methodref #6.#96 // com/imall/s2c/log/vo/SkuOperateLogVo.getCreateTime:()Ljava/lang/ String; #13 = Methodref #24.#97 // java/lang/Object.hashCode:()I #14 = Class #98 // java/lang/StringBuilder #15 = Methodref #14.#85 // java/lang/StringBuilder."<init>":()V #16 = String #99 // SkuOperateLogVo(operator= #17 = Methodref #14.#100 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/St ringBuilder; #18 = String #101 // , skuId= #19 = Methodref #14.#102 // java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/St ringBuilder; #20 = String #103 // , operateContent= #21 = String #104 // , createTime= #22 = String #105 // ) #23 = Methodref #14.#106 // java/lang/StringBuilder.toString:()Ljava/lang/String; #24 = Class #107 // java/lang/Object #25 = Utf8 operator #26 = Utf8 Ljava/lang/String; #27 = Utf8 RuntimeVisibleAnnotations #28 = Utf8 Lio/swagger/annotations/ApiModelProperty; #29 = Utf8 value #30 = Utf8 操作人 #31 = Utf8 skuId #32 = Utf8 Ljava/lang/Long; #33 = Utf8 operateContent #34 = Utf8 操作内容 #35 = Utf8 createTime #36 = Utf8 操作时间 #37 = Utf8 <init> #38 = Utf8 ()V #39 = Utf8 Code #40 = Utf8 LineNumberTable #41 = Utf8 LocalVariableTable #42 = Utf8 this #43 = Utf8 Lcom/imall/s2c/log/vo/SkuOperateLogVo; #44 = Utf8 getOperator #45 = Utf8 ()Ljava/lang/String; #46 = Utf8 getSkuId #47 = Utf8 ()Ljava/lang/Long; #48 = Utf8 getOperateContent #49 = Utf8 getCreateTime #50 = Utf8 setOperator #51 = Utf8 (Ljava/lang/String;)V #52 = Utf8 setSkuId #53 = Utf8 (Ljava/lang/Long;)V #54 = Utf8 setOperateContent #55 = Utf8 setCreateTime #56 = Utf8 equals #57 = Utf8 (Ljava/lang/Object;)Z #58 = Utf8 o #59 = Utf8 Ljava/lang/Object; #60 = Utf8 other #61 = Utf8 this$operator #62 = Utf8 other$operator #63 = Utf8 this$skuId #64 = Utf8 other$skuId #65 = Utf8 this$operateContent #66 = Utf8 other$operateContent #67 = Utf8 this$createTime #68 = Utf8 other$createTime #69 = Utf8 StackMapTable #70 = Class #90 // com/imall/s2c/log/vo/SkuOperateLogVo #71 = Class #107 // java/lang/Object #72 = Utf8 canEqual #73 = Utf8 hashCode #74 = Utf8 ()I #75 = Utf8 PRIME #76 = Utf8 I #77 = Utf8 result #78 = Utf8 $operator #79 = Utf8 $skuId #80 = Utf8 $operateContent #81 = Utf8 $createTime #82 = Utf8 toString #83 = Utf8 SourceFile #84 = Utf8 SkuOperateLogVo.java #85 = NameAndType #37:#38 // "<init>":()V #86 = NameAndType #25:#26 // operator:Ljava/lang/String; #87 = NameAndType #31:#32 // skuId:Ljava/lang/Long; #88 = NameAndType #33:#26 // operateContent:Ljava/lang/String; #89 = NameAndType #35:#26 // createTime:Ljava/lang/String; #90 = Utf8 com/imall/s2c/log/vo/SkuOperateLogVo #91 = NameAndType #72:#57 // canEqual:(Ljava/lang/Object;)Z #92 = NameAndType #44:#45 // getOperator:()Ljava/lang/String; #93 = NameAndType #56:#57 // equals:(Ljava/lang/Object;)Z #94 = NameAndType #46:#47 // getSkuId:()Ljava/lang/Long; #95 = NameAndType #48:#45 // getOperateContent:()Ljava/lang/String; #96 = NameAndType #49:#45 // getCreateTime:()Ljava/lang/String; #97 = NameAndType #73:#74 // hashCode:()I #98 = Utf8 java/lang/StringBuilder #99 = Utf8 SkuOperateLogVo(operator= #100 = NameAndType #108:#109 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder; #101 = Utf8 , skuId= #102 = NameAndType #108:#110 // append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; #103 = Utf8 , operateContent= #104 = Utf8 , createTime= #105 = Utf8 ) #106 = NameAndType #82:#45 // toString:()Ljava/lang/String; #107 = Utf8 java/lang/Object #108 = Utf8 append #109 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder; #110 = Utf8 (Ljava/lang/Object;)Ljava/lang/StringBuilder; { public com.imall.s2c.log.vo.SkuOperateLogVo(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; public java.lang.String getOperator(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #2 // Field operator:Ljava/lang/String; 4: areturn LineNumberTable: line 13: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; public java.lang.Long getSkuId(); descriptor: ()Ljava/lang/Long; flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #3 // Field skuId:Ljava/lang/Long; 4: areturn LineNumberTable: line 16: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; public java.lang.String getOperateContent(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #4 // Field operateContent:Ljava/lang/String; 4: areturn LineNumberTable: line 19: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; public java.lang.String getCreateTime(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #5 // Field createTime:Ljava/lang/String; 4: areturn LineNumberTable: line 22: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; public void setOperator(java.lang.String); descriptor: (Ljava/lang/String;)V flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: putfield #2 // Field operator:Ljava/lang/String; 5: return LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 6 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 0 6 1 operator Ljava/lang/String; public void setSkuId(java.lang.Long); descriptor: (Ljava/lang/Long;)V flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: putfield #3 // Field skuId:Ljava/lang/Long; 5: return LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 6 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 0 6 1 skuId Ljava/lang/Long; public void setOperateContent(java.lang.String); descriptor: (Ljava/lang/String;)V flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: putfield #4 // Field operateContent:Ljava/lang/String; 5: return LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 6 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 0 6 1 operateContent Ljava/lang/String; public void setCreateTime(java.lang.String); descriptor: (Ljava/lang/String;)V flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=2 0: aload_0 1: aload_1 2: putfield #5 // Field createTime:Ljava/lang/String; 5: return LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 6 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 0 6 1 createTime Ljava/lang/String; public boolean equals(java.lang.Object); descriptor: (Ljava/lang/Object;)Z flags: ACC_PUBLIC Code: stack=2, locals=11, args_size=2 0: aload_1 1: aload_0 2: if_acmpne 7 5: iconst_1 6: ireturn 7: aload_1 8: instanceof #6 // class com/imall/s2c/log/vo/SkuOperateLogVo 11: ifne 16 14: iconst_0 15: ireturn 16: aload_1 17: checkcast #6 // class com/imall/s2c/log/vo/SkuOperateLogVo 20: astore_2 21: aload_2 22: aload_0 23: invokevirtual #7 // Method canEqual:(Ljava/lang/Object;)Z 26: ifne 31 29: iconst_0 30: ireturn 31: aload_0 32: invokevirtual #8 // Method getOperator:()Ljava/lang/String; 35: astore_3 36: aload_2 37: invokevirtual #8 // Method getOperator:()Ljava/lang/String; 40: astore 4 42: aload_3 43: ifnonnull 54 46: aload 4 48: ifnull 65 51: goto 63 54: aload_3 55: aload 4 57: invokevirtual #9 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z 60: ifne 65 63: iconst_0 64: ireturn 65: aload_0 66: invokevirtual #10 // Method getSkuId:()Ljava/lang/Long; 69: astore 5 71: aload_2 72: invokevirtual #10 // Method getSkuId:()Ljava/lang/Long; 75: astore 6 77: aload 5 79: ifnonnull 90 82: aload 6 84: ifnull 102 87: goto 100 90: aload 5 92: aload 6 94: invokevirtual #9 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z 97: ifne 102 100: iconst_0 101: ireturn 102: aload_0 103: invokevirtual #11 // Method getOperateContent:()Ljava/lang/String; 106: astore 7 108: aload_2 109: invokevirtual #11 // Method getOperateContent:()Ljava/lang/String; 112: astore 8 114: aload 7 116: ifnonnull 127 119: aload 8 121: ifnull 139 124: goto 137 127: aload 7 129: aload 8 131: invokevirtual #9 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z 134: ifne 139 137: iconst_0 138: ireturn 139: aload_0 140: invokevirtual #12 // Method getCreateTime:()Ljava/lang/String; 143: astore 9 145: aload_2 146: invokevirtual #12 // Method getCreateTime:()Ljava/lang/String; 149: astore 10 151: aload 9 153: ifnonnull 164 156: aload 10 158: ifnull 176 161: goto 174 164: aload 9 166: aload 10 168: invokevirtual #9 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z 171: ifne 176 174: iconst_0 175: ireturn 176: iconst_1 177: ireturn LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 178 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 0 178 1 o Ljava/lang/Object; 21 157 2 other Lcom/imall/s2c/log/vo/SkuOperateLogVo; 36 142 3 this$operator Ljava/lang/Object; 42 136 4 other$operator Ljava/lang/Object; 71 107 5 this$skuId Ljava/lang/Object; 77 101 6 other$skuId Ljava/lang/Object; 108 70 7 this$operateContent Ljava/lang/Object; 114 64 8 other$operateContent Ljava/lang/Object; 145 33 9 this$createTime Ljava/lang/Object; 151 27 10 other$createTime Ljava/lang/Object; StackMapTable: number_of_entries = 15 frame_type = 7 /* same */ frame_type = 8 /* same */ frame_type = 252 /* append */ offset_delta = 14 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo ] frame_type = 253 /* append */ offset_delta = 22 locals = [ class java/lang/Object, class java/lang/Object ] frame_type = 8 /* same */ frame_type = 1 /* same */ frame_type = 253 /* append */ offset_delta = 24 locals = [ class java/lang/Object, class java/lang/Object ] frame_type = 9 /* same */ frame_type = 1 /* same */ frame_type = 253 /* append */ offset_delta = 24 locals = [ class java/lang/Object, class java/lang/Object ] frame_type = 9 /* same */ frame_type = 1 /* same */ frame_type = 253 /* append */ offset_delta = 24 locals = [ class java/lang/Object, class java/lang/Object ] frame_type = 9 /* same */ frame_type = 1 /* same */ protected boolean canEqual(java.lang.Object); descriptor: (Ljava/lang/Object;)Z flags: ACC_PROTECTED Code: stack=1, locals=2, args_size=2 0: aload_1 1: instanceof #6 // class com/imall/s2c/log/vo/SkuOperateLogVo 4: ireturn LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 0 5 1 other Ljava/lang/Object; public int hashCode(); descriptor: ()I flags: ACC_PUBLIC Code: stack=2, locals=7, args_size=1 0: bipush 59 2: istore_1 3: iconst_1 4: istore_2 5: aload_0 6: invokevirtual #8 // Method getOperator:()Ljava/lang/String; 9: astore_3 10: iload_2 11: bipush 59 13: imul 14: aload_3 15: ifnonnull 23 18: bipush 43 20: goto 27 23: aload_3 24: invokevirtual #13 // Method java/lang/Object.hashCode:()I 27: iadd 28: istore_2 29: aload_0 30: invokevirtual #10 // Method getSkuId:()Ljava/lang/Long; 33: astore 4 35: iload_2 36: bipush 59 38: imul 39: aload 4 41: ifnonnull 49 44: bipush 43 46: goto 54 49: aload 4 51: invokevirtual #13 // Method java/lang/Object.hashCode:()I 54: iadd 55: istore_2 56: aload_0 57: invokevirtual #11 // Method getOperateContent:()Ljava/lang/String; 60: astore 5 62: iload_2 63: bipush 59 65: imul 66: aload 5 68: ifnonnull 76 71: bipush 43 73: goto 81 76: aload 5 78: invokevirtual #13 // Method java/lang/Object.hashCode:()I 81: iadd 82: istore_2 83: aload_0 84: invokevirtual #12 // Method getCreateTime:()Ljava/lang/String; 87: astore 6 89: iload_2 90: bipush 59 92: imul 93: aload 6 95: ifnonnull 103 98: bipush 43 100: goto 108 103: aload 6 105: invokevirtual #13 // Method java/lang/Object.hashCode:()I 108: iadd 109: istore_2 110: iload_2 111: ireturn LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 112 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; 3 109 1 PRIME I 5 107 2 result I 10 102 3 $operator Ljava/lang/Object; 35 77 4 $skuId Ljava/lang/Object; 62 50 5 $operateContent Ljava/lang/Object; 89 23 6 $createTime Ljava/lang/Object; StackMapTable: number_of_entries = 8 frame_type = 255 /* full_frame */ offset_delta = 23 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object ] stack = [ int ] frame_type = 255 /* full_frame */ offset_delta = 3 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object ] stack = [ int, int ] frame_type = 255 /* full_frame */ offset_delta = 21 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java /lang/Object ] stack = [ int ] frame_type = 255 /* full_frame */ offset_delta = 4 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java /lang/Object ] stack = [ int, int ] frame_type = 255 /* full_frame */ offset_delta = 21 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java /lang/Object, class java/lang/Object ] stack = [ int ] frame_type = 255 /* full_frame */ offset_delta = 4 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java /lang/Object, class java/lang/Object ] stack = [ int, int ] frame_type = 255 /* full_frame */ offset_delta = 21 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java /lang/Object, class java/lang/Object, class java/lang/Object ] stack = [ int ] frame_type = 255 /* full_frame */ offset_delta = 4 locals = [ class com/imall/s2c/log/vo/SkuOperateLogVo, int, int, class java/lang/Object, class java /lang/Object, class java/lang/Object, class java/lang/Object ] stack = [ int, int ] public java.lang.String toString(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: new #14 // class java/lang/StringBuilder 3: dup 4: invokespecial #15 // Method java/lang/StringBuilder."<init>":()V 7: ldc #16 // String SkuOperateLogVo(operator= 9: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 12: aload_0 13: invokevirtual #8 // Method getOperator:()Ljava/lang/String; 16: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 19: ldc #18 // String , skuId= 21: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 24: aload_0 25: invokevirtual #10 // Method getSkuId:()Ljava/lang/Long; 28: invokevirtual #19 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Lj ava/lang/StringBuilder; 31: ldc #20 // String , operateContent= 33: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 36: aload_0 37: invokevirtual #11 // Method getOperateContent:()Ljava/lang/String; 40: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 43: ldc #21 // String , createTime= 45: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 48: aload_0 49: invokevirtual #12 // Method getCreateTime:()Ljava/lang/String; 52: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 55: ldc #22 // String ) 57: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Lj ava/lang/StringBuilder; 60: invokevirtual #23 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 63: areturn LineNumberTable: line 9: 0 LocalVariableTable: Start Length Slot Name Signature 0 64 0 this Lcom/imall/s2c/log/vo/SkuOperateLogVo; } SourceFile: "SkuOperateLogVo.java"
1.1、字面量(指由字母和数字等构成的字符串或数值常量,也就是=右边的值,如下面的1, 2,"abcdefg")
int a = 1; int b = 2; int c = "abcdefg";
1.2、符号引用(相对于直接引用来说)
主要包含三种情况:a、类和接口的全限定名。b、字段的名称和描述。c、方法的名称和描述。如上面的a、b、c就是字段名称,还有SkuOperateLogVo类常量池里的 Lcom/imall/s2c/log/vo/SkuOperateLogVo 是类的全限定名,getOperator等是方法名,()是UTF8格式的描述符,这些都是符号引用。
2、运行时常量池
class常量池目前是静态信息,只有运行时被加载到内存中,这些符号引用才会转换为代码对应的内存地址。class常量池一旦被加载到内存中就变为了运行时常量池,对应的符号引用在程序加载或运行时会被转换为被加载到内存区域的代码的直接引用,也就是我们说的动态链接。例如,compute()这个符号引用在运行时就会被转变为compute()方法具体代码在内存中的 地址,主要通过对象头里的类型指针去转换直接引用。
3、字符串常量池
jdk7,8版本中,字符串常量池在堆中。
//在常量池创建abcdefg String a = "abcdefg"; //先在常量池判断abcdefg是否存在,不存在创建,存在不操作,再在堆中创建abcdefg对象 String b = new String("abcdefg"); //判断abcdefg在常量池中是否存在,存在则引用,不存在则在常量池中创建指向堆中的指针 String c = b.intern(); //先判断常量池中是否存在abcdefg1,不存在创建,存在不操作,再在堆中创建abcdefg1 String b1 = new String("abcdefg1"); //先判断abcdefg1在常量池中是否存在,存在则引用,不存在则在常量池中创建指向堆中的指针 String c1 = b1.intern(); //存在变量,编译期间无法执行,使用jclass发现使用了StringBuilder String d = a+"hi"; //先判断常量池中是否存在,不存在则创建,存在则引用 String e = "abcdefghi"; //先判断常量池中是否存在,不存在则创建,存在不操作,再在对中创建java对象 String f = new String("java"); //先判断常量池中是否存在,存在则引用,不存在则创建指向堆中字符串的指针 String g = f.intern(); //先判断常量池中是否存在,不存在则创建,存在则引用 String h = "java"; System.out.println( a==b);//false System.out.println( b==c);//false System.out.println( b1==c1);//false System.out.println( a==c);//true System.out.println( d==e);//false System.out.println( f==g);//false System.out.println( h==g);//true
选中类,在view中执行show bytecode with jclasslib

4、8种基本类型的包装类和对象池
java中基本类型的包装类大部分都包含了常量池技术(对象池),这些类是Byte,Short,Integer,Long,Character,Boolean,其余两种浮点类型则没有实现,另外Byte,Short,Integer,Long,Character这5种,只有在值大于-128并小于127时,才会使用对象池。
//通过jclasslib发现使用了invokestatic #2 <java/lang/Integer.valueOf>
Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; Integer e = -129; Integer f = -129; Integer g = -128; Integer h = -128; //new不会使用对象池 Integer i = new Integer(127); Integer j = new Integer(127); System.out.println(a==b);//true System.out.println(c==d);//false System.out.println(e==f);//false System.out.println(g==h);//true System.out.println(i==j);//false
valueof方法会优先使用Integer数组中的数据
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }

浙公网安备 33010602011771号