亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解JAVA 常量池

 更新時(shí)間:2020年07月14日 11:15:45   作者:團(tuán)隊(duì)buff工具人  
這篇文章主要介紹了JAVA 常量池的相關(guān)資料,文中講解非常詳細(xì),示例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

前言

對(duì)常量池的理解之前,需要熟悉的是一些術(shù)語(yǔ):

字面量

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

百度也給了一個(gè)例子:

這個(gè)object-c 的例子,容易理解。

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

正文

JVM常量池主要分為Class文件常量池、運(yùn)行時(shí)常量池,全局字符串常量池,以及基本類(lèi)型包裝類(lèi)對(duì)象常量池。

我在網(wǎng)上找了一個(gè)例子:

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: 1
Constant 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 常量池

主要包括:字面量和符號(hào)引用

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

字符字面值:

#7 = Utf8               s
#20 = Utf8               abc

用final修飾的成員變量

#9 = Utf8               f
#11 = Integer            257

大概包含的就是這兩種。

符號(hào)引用

符號(hào)引用主要設(shè)涉及編譯原理方面的概念,包括下面三類(lèi)常量:

類(lèi)和接口的全限定名,也就是java/lang/String;這樣,將類(lèi)名中原來(lái)的"."替換為"/"得到的,主要用于在運(yùn)行時(shí)解析得到類(lèi)的直接引用,像上面

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

字段的名稱(chēng)和描述符,字段也就是類(lèi)或者接口中聲明的變量,包括類(lèi)級(jí)別變量和實(shí)例級(jí)的變量

#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

//這兩個(gè)是局部變量,值保留字段名稱(chēng)
#23 = Utf8               v
#24 = Utf8               temp

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

方法中的名稱(chēng)和描述符,也即參數(shù)類(lèi)型+返回值

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

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

其實(shí)并不需要怎么關(guān)注符號(hào)引用。

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

運(yùn)行時(shí)常量池是方法區(qū)的一部分,所以也是全局貢獻(xiàn)的,我們知道,jvm在執(zhí)行某個(gè)類(lèi)的時(shí)候,必須經(jīng)過(guò)加載、鏈接(驗(yàn)證、準(zhǔn)備、解析)、初始化,在第一步加載的時(shí)候需要完成:

通過(guò)一個(gè)類(lèi)的全限定名來(lái)獲取此類(lèi)的二進(jìn)制字節(jié)流

將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)

在內(nèi)存中生成一個(gè)類(lèi)對(duì)象,代表加載的這個(gè)類(lèi),這個(gè)對(duì)象是java.lang.Class,它作為方法區(qū)這個(gè)類(lèi)的各種數(shù)據(jù)訪(fǎng)問(wèn)的入口。

類(lèi)對(duì)象和普通對(duì)象是不同的,類(lèi)對(duì)象是在類(lèi)加載的時(shí)候完成的,是jvm創(chuàng)建的并且是單例的,作為這個(gè)類(lèi)和外界交互的入口, 而普通的對(duì)象一般是在調(diào)用new之后創(chuàng)建。

上面的第二條,將class字節(jié)流代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),其中就包含了class文件常量池進(jìn)入運(yùn)行時(shí)常量池的過(guò)程,這里需要強(qiáng)調(diào)一下不同的類(lèi)共用一個(gè)運(yùn)行時(shí)常量池,同時(shí)在進(jìn)入運(yùn)行時(shí)常量池的過(guò)程中,多個(gè)class文件中常量池相同的字符串,多個(gè)class文件中常量池中相同的字符串只會(huì)存在一份在運(yùn)行時(shí)常量池,這也是一種優(yōu)化。

運(yùn)行時(shí)常量池的作用是存儲(chǔ)java class文件常量池中的符號(hào)信息,運(yùn)行時(shí)常量池中保存著一些class文件中描述的符號(hào)引用,同時(shí)在類(lèi)的解析階段還會(huì)將這些符號(hào)引用翻譯出直接引用(直接指向?qū)嵗龑?duì)象的指針,內(nèi)存地址),翻譯出來(lái)的直接引用也是存儲(chǔ)在運(yùn)行時(shí)常量池中。

運(yùn)行時(shí)常量池相對(duì)于class常量池一大特征就是具有動(dòng)態(tài)性,java規(guī)范并不要求常量只能在運(yùn)行時(shí)才產(chǎn)生,也就是說(shuō)運(yùn)行時(shí)常量池的內(nèi)容并不全部來(lái)自class常量池,在運(yùn)行時(shí)可以通過(guò)代碼生成常量并將其放入運(yùn)行時(shí)常量池中,這種特性被用的最多的就是String.intern()。

那么就看下String.intern() 來(lái)理解:運(yùn)行時(shí)常量池。

首先看下:

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

有什么區(qū)別?

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

但是他們運(yùn)行差別很大。string x="x" 會(huì)查找常量池,如果沒(méi)有x的話(huà),那么會(huì)存入常量池,如果有的話(huà),那么會(huì)存在于常量池并進(jìn)行引用。

而 String x=new String("x") 則只會(huì)生成在堆中,而不會(huì)和常量池產(chǎn)生聯(lián)系。

注:

常量字符串和變量拼接時(shí)(如:String str3=baseStr + “01”;)會(huì)調(diào)用stringBuilder.append()在堆上創(chuàng)建新的對(duì)象。

那么String.intern() 是什么意思呢?這個(gè)是會(huì)去查找變量詞中有沒(méi)有,如果有的話(huà)那么會(huì)返回引用,如果沒(méi)有的話(huà),這個(gè)和版本有關(guān)。

題目

public static void main(String[] args) {
// write your code here
	Integer 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);
}

問(wèn)題如下:

i01 是否和 i02 相等?

i03 是否和 i01 相等。

i04 是否和 i01相等。

總結(jié)

寫(xiě)的比較倉(cāng)促,后續(xù)會(huì)完善好。

以上就是詳解JAVA 常量池的詳細(xì)內(nèi)容,更多關(guān)于java 常量池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring-boot實(shí)現(xiàn)增加自定義filter(新)

    spring-boot實(shí)現(xiàn)增加自定義filter(新)

    本篇文章主要介紹了spring-boot實(shí)現(xiàn)增加自定義filter(新),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java的內(nèi)存機(jī)制詳解

    Java的內(nèi)存機(jī)制詳解

    本文主要介紹了Java的內(nèi)存機(jī)制的相關(guān)知識(shí),具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)

    Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)

    這篇文章主要介紹了Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • SpringBoot集成DJL實(shí)現(xiàn)圖片分類(lèi)功能

    SpringBoot集成DJL實(shí)現(xiàn)圖片分類(lèi)功能

    DJL是一個(gè)使用Java?API簡(jiǎn)化模型訓(xùn)練、測(cè)試、部署和使用深度學(xué)習(xí)模型進(jìn)行推理的開(kāi)源庫(kù)深度學(xué)習(xí)工具包,開(kāi)源的許可協(xié)議是Apache-2.0,本文給大家介紹了SpringBoot集成DJL實(shí)現(xiàn)圖片分類(lèi)功能,需要的朋友可以參考下
    2024-10-10
  • java OpenTelemetry日志體系及缺陷解決方案

    java OpenTelemetry日志體系及缺陷解決方案

    這篇文章主要為大家介紹了java OpenTelemetry日志體系及缺陷解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • java?Date和SimpleDateFormat時(shí)間類(lèi)詳解

    java?Date和SimpleDateFormat時(shí)間類(lèi)詳解

    這篇文章主要介紹了java?Date和SimpleDateFormat時(shí)間類(lèi)詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • java實(shí)現(xiàn)基于SMTP發(fā)送郵件的方法

    java實(shí)現(xiàn)基于SMTP發(fā)送郵件的方法

    這篇文章主要介紹了java實(shí)現(xiàn)基于SMTP發(fā)送郵件的方法,實(shí)例分析了java基于SMTP服務(wù)發(fā)送郵件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java cglib為實(shí)體類(lèi)(javabean)動(dòng)態(tài)添加屬性方式

    Java cglib為實(shí)體類(lèi)(javabean)動(dòng)態(tài)添加屬性方式

    這篇文章主要介紹了Java cglib為實(shí)體類(lèi)(javabean)動(dòng)態(tài)添加屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java Socket實(shí)現(xiàn)多線(xiàn)程通信功能示例

    Java Socket實(shí)現(xiàn)多線(xiàn)程通信功能示例

    這篇文章主要介紹了Java Socket實(shí)現(xiàn)多線(xiàn)程通信功能,結(jié)合具體實(shí)例形式較為詳細(xì)的分析了java多線(xiàn)程通信的原理及客戶(hù)端、服務(wù)器端相應(yīng)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • Java實(shí)現(xiàn)規(guī)則幾何圖形的繪制與周長(zhǎng)面積計(jì)算詳解

    Java實(shí)現(xiàn)規(guī)則幾何圖形的繪制與周長(zhǎng)面積計(jì)算詳解

    隨著計(jì)算機(jī)的發(fā)展,人們對(duì)圖形的計(jì)算要求會(huì)越來(lái)越高。在各行各業(yè)中的計(jì)算人員會(huì)對(duì)圖形的計(jì)算要有便利的要求,規(guī)則幾何圖形問(wèn)題求解程序應(yīng)運(yùn)而生!本文將用Java編寫(xiě)一個(gè)程序,可以實(shí)現(xiàn)規(guī)則幾何圖形的繪制與周長(zhǎng)面積計(jì)算,感興趣的可以了解一下
    2022-07-07

最新評(píng)論