日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解JAVA 常量池

瀏覽:38日期:2022-08-29 11:14:56

前言

對常量池的理解之前,需要熟悉的是一些術語:

字面量

在計算機科學中,字面量(literal)是用于表達源代碼中一個固定值的表示法(notation)。幾乎所有計算機編程語言都具有對基本值的字面量表示,諸如:整數、浮點數以及字符串;而有很多也對布爾類型和字符類型的值也支持字面量表示;還有一些甚至對枚舉類型的元素以及像數組、記錄和對象等復合類型的值也支持字面量表示法。C語言關于復合字面量的介紹可參考: [1] 。

百度也給了一個例子:

這個object-c 的例子,容易理解。

#include <stdio.h>int main(void){ int a = 10; // 10為int類型字面量 char a[] = {'Hello world!'} // Hello world 為字符串形式字面量 ............. // 以此類推,不再贅述 return 0;}

正文

JVM常量池主要分為Class文件常量池、運行時常量池,全局字符串常量池,以及基本類型包裝類對象常量池。

我在網上找了一個例子:

private int value = 1;public String s = 'abc';public final static int f = 0x101;public static void main(String[] args){}public void setValue(int v){final int temp = 3;this.value = temp + v;}public int getValue(){return value;}

編譯后:

下面只截取了一部分,常量池:

public class test.program minor version: 0 major version: 57 flags: (0x0021) ACC_PUBLIC, ACC_SUPER this_class: #1 // test/program super_class: #3 // java/lang/Object interfaces: 0, fields: 3, methods: 4, attributes: 1Constant pool: #1 = Class #2 // test/program #2 = Utf8 test/program #3 = Class #4 // java/lang/Object #4 = Utf8 java/lang/Object #5 = Utf8 value #6 = Utf8 I #7 = Utf8 s #8 = Utf8 Ljava/lang/String; #9 = Utf8 f #10 = Utf8 ConstantValue #11 = Integer 257 #12 = Utf8 <init> #13 = Utf8 ()V #14 = Utf8 Code #15 = Methodref #3.#16 // java/lang/Object.'<init>':()V #16 = NameAndType #12:#13 // '<init>':()V #17 = Fieldref #1.#18 // test/program.value:I #18 = NameAndType #5:#6 // value:I #19 = String #20 // abc #20 = Utf8 abc #21 = Fieldref #1.#22 // test/program.s:Ljava/lang/String; #22 = NameAndType #7:#8 // s:Ljava/lang/String; #23 = Utf8 LineNumberTable #24 = Utf8 LocalVariableTable #25 = Utf8 this #26 = Utf8 Ltest/program; #27 = Utf8 main #28 = Utf8 ([Ljava/lang/String;)V #29 = Utf8 args #30 = Utf8 [Ljava/lang/String; #31 = Utf8 setValue #32 = Utf8 (I)V #33 = Utf8 v #34 = Utf8 temp #35 = Utf8 getValue #36 = Utf8 ()I #37 = Utf8 SourceFile #38 = Utf8 program.java

好的下面介紹class 常量池;

class 常量池

主要包括:字面量和符號引用

首先字面量不是全部的字面量,如果不明白什么是字面值請看上面;

字符字面值:

#7 = Utf8 s#20 = Utf8 abc

用final修飾的成員變量

#9 = Utf8 f#11 = Integer 257

大概包含的就是這兩種。

符號引用

符號引用主要設涉及編譯原理方面的概念,包括下面三類常量:

類和接口的全限定名,也就是java/lang/String;這樣,將類名中原來的'.'替換為'/'得到的,主要用于在運行時解析得到類的直接引用,像上面

#5 = Class #33 // JavaBasicKnowledge/JavaBean#33 = Utf8 JavaBasicKnowledge/JavaBean

字段的名稱和描述符,字段也就是類或者接口中聲明的變量,包括類級別變量和實例級的變量

#4 = Fieldref #5.#32 // JavaBasicKnowledge/JavaBean.value:I#5 = Class #33 // JavaBasicKnowledge/JavaBean#32 = NameAndType #7:#8 // value:I

#7 = Utf8 value#8 = Utf8 I

//這兩個是局部變量,值保留字段名稱#23 = Utf8 v#24 = Utf8 temp

可以看到,對于方法中的局部變量名,class文件的常量池僅僅保存字段名。

方法中的名稱和描述符,也即參數類型+返回值

#21 = Utf8 setValue #22 = Utf8 (I)V

#25 = Utf8 getValue #26 = Utf8 ()I

其實并不需要怎么關注符號引用。

那么這些class 常量池有什么好處呢?

運行時常量池是方法區的一部分,所以也是全局貢獻的,我們知道,jvm在執行某個類的時候,必須經過加載、鏈接(驗證、準備、解析)、初始化,在第一步加載的時候需要完成:

通過一個類的全限定名來獲取此類的二進制字節流

將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構

在內存中生成一個類對象,代表加載的這個類,這個對象是java.lang.Class,它作為方法區這個類的各種數據訪問的入口。

類對象和普通對象是不同的,類對象是在類加載的時候完成的,是jvm創建的并且是單例的,作為這個類和外界交互的入口, 而普通的對象一般是在調用new之后創建。

上面的第二條,將class字節流代表的靜態存儲結構轉化為方法區的運行時數據結構,其中就包含了class文件常量池進入運行時常量池的過程,這里需要強調一下不同的類共用一個運行時常量池,同時在進入運行時常量池的過程中,多個class文件中常量池相同的字符串,多個class文件中常量池中相同的字符串只會存在一份在運行時常量池,這也是一種優化。

運行時常量池的作用是存儲java class文件常量池中的符號信息,運行時常量池中保存著一些class文件中描述的符號引用,同時在類的解析階段還會將這些符號引用翻譯出直接引用(直接指向實例對象的指針,內存地址),翻譯出來的直接引用也是存儲在運行時常量池中。

運行時常量池相對于class常量池一大特征就是具有動態性,java規范并不要求常量只能在運行時才產生,也就是說運行時常量池的內容并不全部來自class常量池,在運行時可以通過代碼生成常量并將其放入運行時常量池中,這種特性被用的最多的就是String.intern()。

那么就看下String.intern() 來理解:運行時常量池。

首先看下:

string x='x' 和 String x=new String('x');

有什么區別?

可以肯定的是他們的值是一樣的。

但是他們運行差別很大。string x='x' 會查找常量池,如果沒有x的話,那么會存入常量池,如果有的話,那么會存在于常量池并進行引用。

而 String x=new String('x') 則只會生成在堆中,而不會和常量池產生聯系。

注:

常量字符串和變量拼接時(如:String str3=baseStr + “01”;)會調用stringBuilder.append()在堆上創建新的對象。

那么String.intern() 是什么意思呢?這個是會去查找變量詞中有沒有,如果有的話那么會返回引用,如果沒有的話,這個和版本有關。

詳解JAVA 常量池

題目

public static void main(String[] args) {// write your code hereInteger i01=59;int i02=59;Integer i03=Integer.valueOf(59);Integer i04= new Integer(59);}public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}

問題如下:

i01 是否和 i02 相等?

i03 是否和 i01 相等。

i04 是否和 i01相等。

總結

寫的比較倉促,后續會完善好。

以上就是詳解JAVA 常量池的詳細內容,更多關于java 常量池的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区成人| 韩国女主播一区二区三区| 日韩中文首页| 欧美久久天堂| 日韩欧美一区二区三区免费看| 在线看片福利| 午夜精品成人av| 香蕉视频亚洲一级| 欧美a级片一区| 国产一区欧美| 欧美精选一区二区三区| 在线一区免费观看| 亚洲一区成人| 亚洲影院天堂中文av色| 久久成人精品| 日本不卡中文字幕| 国产精品羞羞答答在线观看| 国产精品黄色| 欧美三区四区| 黄色日韩精品| 日韩精品免费一区二区夜夜嗨| 国产亚洲人成a在线v网站| 欧美激情福利| 久久久久久黄| 亚洲欧美一级| 精品视频亚洲| 五月综合激情| 欧美日韩18| 国产a亚洲精品| 日韩精品影视| 国产午夜久久| 久久国产人妖系列| 最新中文字幕在线播放 | 色婷婷色综合| 久久精品影视| 亚州精品视频| 精品视频在线你懂得| 久久中文亚洲字幕| 综合激情一区| 高清精品久久| 亚洲综合丁香| 久久精品福利| 久久国产电影| 日本99精品| 国产精品精品国产一区二区| 亚洲福利专区| 国产乱子精品一区二区在线观看| 国产精品不卡| 亚洲免费成人av在线| 国产一区丝袜| 蜜臀av性久久久久蜜臀aⅴ流畅 | 在线亚洲观看| 国产精品探花在线观看| 婷婷成人综合| 国产欧美日韩在线一区二区| 麻豆理论在线观看| 亚洲久草在线| 免费看av不卡| 欧美一区久久| 婷婷丁香综合| 麻豆国产精品一区二区三区| 免费毛片在线不卡| 国产精品成人3p一区二区三区| 国产麻豆久久| 欧美日韩 国产精品| 久久婷婷一区| 奇米狠狠一区二区三区| 在线日韩av| 麻豆国产精品一区二区三区| 蜜臀精品久久久久久蜜臀| 精品国产aⅴ| 视频一区在线视频| 91青青国产在线观看精品| 亚洲精品在线国产| 伊人久久av| 国产精品香蕉| 一区二区精彩视频| 日韩理论视频| 国产高清日韩| 中文字幕中文字幕精品| 亚洲婷婷在线| 久久一区精品| 日本亚州欧洲精品不卡| 欧美成人久久| 日本一区二区免费高清| 日韩av中文字幕一区| av不卡在线看| 91一区二区三区四区| 国产日韩在线观看视频| 综合激情五月婷婷| 亚洲综合日韩| 午夜欧美在线| 久久青草久久| 激情黄产视频在线免费观看| 欧美黄色一区| 国产精品男女| 日韩精品1区2区3区| 天堂成人免费av电影一区| 久久中文字幕av一区二区不卡| 国产精品成久久久久| 国产精品啊v在线| 亚洲精品观看| 亚洲一区av| 在线看片日韩| 蜜桃久久久久久| 亚洲夜间福利| 在线日韩视频| 欧美手机在线| 欧美日韩尤物久久| 福利片在线一区二区| 久久久精品区| 国产欧美二区| 欧美亚洲免费| 国产欧美日韩一级| 国产伦一区二区三区| 国产精品亚洲一区二区在线观看| 欧美中文高清| 91精品国产一区二区在线观看| 最新国产精品久久久| 一区二区三区国产盗摄| 亚洲精品日本| 日韩国产在线不卡视频| 日韩av网站在线免费观看| 日本成人在线视频网站| 欧美日韩18| 久久久免费人体| 国产欧美91| 国产欧美激情| 老司机免费视频一区二区三区| 精品视频在线你懂得| 美女av在线免费看| 久久精品观看| 在线亚洲免费| 蜜臀av一区二区在线免费观看 | 91精品成人| 亚洲精品1区| 亚洲一区日韩在线| 免费欧美在线视频| 人人爱人人干婷婷丁香亚洲| 久久wwww| 精品久久免费| 欧美成人a交片免费看| 国产一区二区三区自拍| 免费视频一区二区| 国产精品中文字幕制服诱惑| 国产欧美另类| av中文资源在线资源免费观看| 丝袜美腿诱惑一区二区三区| 一本一道久久a久久精品蜜桃| 免费成人在线影院| 欧美日韩夜夜| 国产一区二区三区久久久久久久久| 日韩欧美另类中文字幕| 色偷偷色偷偷色偷偷在线视频| 亚洲欧美日韩专区| 久久av中文| 国产精品一站二站| 91久久精品无嫩草影院| 岛国av在线播放| 色综合www| 久久青草久久| 日韩精品一二三| 国产欧美日韩一级| 岛国精品一区| 亚洲黄色影院| 国产九一精品| 蜜桃成人精品| 亚洲狼人精品一区二区三区| 国产精品magnet| 免费观看亚洲| 欧美~级网站不卡| 91嫩草精品| 国产99久久| 日本视频在线一区| 久久久久中文| 91久久精品无嫩草影院| 日韩免费一区| 日韩精品中文字幕吗一区二区 | 午夜欧美视频| 欧美影院视频| 日韩欧美不卡| 免费日韩精品中文字幕视频在线| 国产丝袜一区| 久久人人99| 国产精品伦一区二区| 欧美亚洲国产精品久久| 日韩福利在线观看| 久久精品1区| 国产亚洲精品美女久久 | 亚洲欧洲另类| 精品欧美视频| 综合在线一区| 久久精品伊人| 亚洲精品乱码久久久久久蜜桃麻豆 | 麻豆免费精品视频| 午夜国产一区二区| 国产一区二区精品久| 亚洲免费一区三区| 久久精品高清| 国产日韩一区二区三区在线|