今日分享开始啦,请大家多多指教~
在很多在面试的过程中,只要我们在日常的工作中,做足充分的准备,在面试之前,多深入的学习一下一些基础的知识,我想对于你想要的那个薪资,你就会更近一步。
当然了,结果是肯定很明显的了,这里就不多说什么了,今天的主角是常量池,上面三大常量池,我会按照面试官的需求,直接反编译,然后给大家看一下具体的实现原理。
class常量池
我们都知道,在大学最一开始学Java的时候,都是文本操作,Javac,java命令执行,而代码经过Javac之后会生成一个xxx.class文件,这是java引以为傲的可移植性的基石。
class文件中,入口是一个u2类型的数据,也就是占据2个字节,用来给常量池的容量计数,其中第0个用于表达“不引用任何一个常量”。在这两个字节之后就是编译器为我们生成的常量了,这些常量包含了两大类:字面量和符号引用,通过一个例子看一下:
public class ThreePoolDemo {
int a=1;
}
javap反编译结果如下:
Classfile
Constant pool:
#1 = Class #2 // com/hustdj/jdkStudy/threePool/ThreePoolDemo
#2 = Utf8 com/hustdj/jdkStudy/threePool/ThreePoolDemo
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 a
#6 = Utf8 I
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Methodref #3.#11 // java/lang/Object."<init>":()V
#11 = NameAndType #7:#8 // "<init>":()V
#12 = Fieldref #1.#13 // com/hustdj/jdkStudy/threePool/ThreePoolDemo.a:I
#13 = NameAndType #5:#6 // a:I
#14 = Utf8 LineNumberTable
#15 = Utf8 LocalVariableTable
#16 = Utf8 this
#17 = Utf8 Lcom/hustdj/jdkStudy/threePool/ThreePoolDemo;
#18 = Utf8 SourceFile
#19 = Utf8 ThreePoolDemo.java
{
int a;
descriptor: I
flags: (0x0000)
public com.hustdj.jdkStudy.threePool.ThreePoolDemo();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #12 // Field a:I
9: return
LineNumberTable:
line 3: 0
line 4: 4
line 3: 9
LocalVariableTable:
S