㈠ 我想問一下java通過new String創建字元串會被保存都常量池中嗎
厚顏無恥的復制下
方式一:String a = 「aaa」 ;
方式二:String b = new String(「aaa」);
兩種方式都能創建字元串對象,但方式一要比方式二更優。
因為字元串是保存在常量池中的,而通過new創建的對象會存放在堆內存中。
常量池中已經有字元串常量」aaa」
通過方式一創建對象,程序運行時會在常量池中查找」aaa」字元串,將找到的」aaa」字元串的地址賦給a。
通過方式二創建對象,無論常量池中有沒有」aaa」字元串,程序都會在堆內存中開辟一片新空間存放新對象。
常量池中沒有字元串常量」aaa」
通過方式一創建對象,程序運行時會將」aaa」字元串放進常量池,再將其地址賦給a。
通過方式二創建對象,程序會在堆內存中開辟一片新空間存放新對象,同時會將」aaa」字元串放入常量池,相當於創建了兩個對象。
㈡ Java中的常量該放在哪
Java中的常量只能定義在類之中
常量定義格式:public|private static final 數據類型 常量名稱 = 值 (開發中88%通用)
㈢ java中基本數據類型int a =10,a在棧中存著,10是在常量池中存著嗎
int a =10 如果是這個 那麼10在棧裡面
Interger a = 10 那麼這個在常量池裡面
a是在-128到127之間,不會去堆中創建對象,而回是直接返回IntegerCache中的值;如果值不答在上面范圍內則會從堆中創建對象。= 走的是valueOf()方法,valueOf(int)會走緩存。
Interger a = new Interger(10) 這個在堆裡面
㈣ Java常量池是什麼有什麼用 和堆、棧有關系求簡單易懂的解釋!
1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.
2. 棧:存放基本類型的變數數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字元串常量對象存放在常量池中。)
3. 堆:存放所有new出來的對象。
4. 靜態域:存放靜態成員(static定義的)
5. 常量池:存放字元串常量和基本類型常量(public static final)。
6. 非RAM存儲:硬碟等永久存儲空間
這里我們主要關心棧,堆和常量池,對於棧和常量池中的對象可以共享,對於堆中的對象不可以共享。棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命周期不需要確定,具有很大的靈活性。
對於字元串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字元串,在常量池中永遠只有一份,在堆中有多份。
㈤ java程序運行的五個步驟
1、Java程序從源文件創建到程序運行要經過兩大步驟:1、源文件由編譯器編譯成位元組碼(ByteCode) 2、位元組碼由java虛擬機解釋運行。因為java程序既要編譯同時也要經過JVM的解釋運行,所以說Java被稱為半解釋語言("semi-interpreted" language)。
第一步(編譯): 創建完源文件之後,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,否則直接引用,這個有點像make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報「cant find symbol」的錯誤。
編譯後的位元組碼文件格式主要分為兩部分:常量池和方法位元組碼。常量池記錄的是代碼出現過的所有token(類名,成員變數名等等)以及符號引用(方法引用,成員變數引用等等);方法位元組碼放的是類中各個方法的位元組碼。
第二步(運行):java類運行的過程大概可分為兩個過程:1、類的載入 2、類的執行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去載入該類。也就是說,JVM並不是在一開始就把一個程序就所有的類都載入到內存中,而是到不得不用的時候才把它載入進來,而且只載入一次。
2、下面是程序運行的詳細步驟:
在編譯好java程序得到Main.class文件後,在命令行上敲java Main。系統就會啟動一個jvm進程,jvm進程從classpath路徑中找到一個名為Main.class的二進制文件,將Main的類信息載入到運行時數據區的方法區內,這個過程叫做Main類的載入。
然後JVM找到Main的主函數入口,開始執行main函數。
main函數的第一條命令是Animal animal = new Animal("Puppy");就是讓JVM創建一個Animal對象,但是這時候方法區中沒有Animal類的信息,所以JVM馬上載入Animal類,把Animal類的類型信息放到方法區中。
載入完Animal類之後,Java虛擬機做的第一件事情就是在堆區中為一個新的Animal實例分配內存, 然後調用構造函數初始化Animal實例,這個Animal實例持有著指向方法區的Animal類的類型信息(其中包含有方法表,java動態綁定的底層實現)的引用。
當使用animal.printName()的時候,JVM根據animal引用找到Animal對象,然後根據Animal對象持有的引用定位到方法區中Animal類的類型信息的方法表,獲得printName()函數的位元組碼的地址。
開始運行printName()函數。
㈥ 什麼是JVM 運行時常量池
運行時常量池 vs 常量池
要弄清楚方法區,需要理解清楚ClassFile,因為載入內的信息都在方法區。
要弄清楚方法區的運行時常量池,需要理解清楚ClassFile中的常量池。
一個Java源文件中的類、介面,編譯後產生一個位元組碼文件。而Java中的位元組碼需要數據支持,通常這種數據會很大以至於不能直接存在位元組碼文件,換另一種方式,可以存在常量池,這個位元組碼包含了指向常量池的引用。在動態鏈接的時候會用到運行時常量池。
棧幀
[圖片上傳失敗...(image-b8ec8b-1600702650468)]
動態鏈接
Javad 方法區究竟存了什麼???
㈦ java中常量存放在哪
首先我認為只有作為類屬性,加上了static final的,才被稱為常量。
可以在三個地方的屬性前添加final:
1.作為類屬性,加static (通常意義上指的就是這種。在編程規范中要求這種屬性名稱必須全大寫。)
2.作為對象屬性,不加static
3.在方法體,或簽名上聲明。
第一種,static的,作為類信息在類被載入時被存在靜態的方法區。
第二種,非static的,作為對象屬性,在對象創建的時候被初始化,存在堆里。
第三種,在方法里的。我們知道在方法被調用時會被載入到棧中進行執行,所以寫在方法里的變數存在棧中。