A. 字元串的常量池和字元串池是一樣的嗎
不是一個東西,常量池必須是字元串初始化的,字元串是對象,在方法區存儲,在heap上開空間存儲
B. 字元串常量池在堆中還是方法區
JDK1.6及以前,常量池在方法區,這時的方法區也叫做永久代;
JDK1.7的時候,方法區合並到了堆內存中,這時的常量池也可以說是在堆內存中;
JDK1.8及以後,方法區又從堆內存中剝離出來了,但實現方式與之前的永久代不同,這時的方法區被叫做元空間,常量池就存儲在元空間。
C. java中的字元串常量池與Java中的堆和棧的區別
java常量池不在堆中也不在棧中,是獨立的內存空間管理。
1. 棧:存放基本類型的變數數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字元串常量對象存放在常量池中。)
2. 堆:存放所有new出來的對象。
3. 常量池:存放字元串常量和基本類型常量(public static final)。
對於字元串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字元串,在常量池中永遠只有一份,在堆中有多份。
D. 求教 java 字元串緩沖區和常量池有什麼關聯、關系
java里的堆棧,常量池,用圖形來表示的話會好理解下,不過不會上傳圖片,就簡單的用文字描述下,希望能幫助你理解.
首先,java里new出來的對象都會存放在堆里.棧里可以存放對這些對象的指針的引用.
例如: A a=new A();
這里new出來的A對象會被存放在堆中,而 a呢.會被存放到棧里,並且保存了對A這個對象引用的地址.
棧的存放順序是後進先出,如果你接觸過數據結構的課程的話,這個並不難理解.
至於字元串池,是用來存放一些字元和棧和堆的關系,我們只需要這么理解,當我們創建一個字元串時,java會先在字元串池裡尋找有沒有你要創建的字元串.
例如: String a="你好";
先尋找字元串池裡有沒有 "你好" 這個字元串,如果存在,就不會在堆中再創建.
如果不存在,就會在堆中創建 "你好" 這個字元串 並在棧中生成 a保存對其的地址引用 然後還會將新創建的字元串"你好" 保存到字元串池中.
E. 反編譯和反匯編有什麼區別
反匯編是把機器碼翻譯成的匯編;
反編譯是把機器碼翻譯成高級語言的過程,但通常要有其他線索輔助才能完成。
F. 什麼叫做字元串常量池
可以理解為內存裡面專門為string類型變數開辟的一片區域
譬如String a = "abc"; 當你定義這樣一個變數的時候,java此時先會去常量池尋找有沒有"abc"這樣的字元串,如果有,直接把內存地址交給a, 否則就生成一個"abc"的字元串
當下一個String b = "abc";的時候,發現常量池已經有"abc"了,此時JVM不會再次生成"abc",而是直接交給"abc"引用給b, 所以此時你會發現a == b
G. java 位元組碼的常量池與虛擬機中的常量池有什麼區別
前者是編譯器的概念,後者是運行時對應的內存區域
H. 什麼是字元串數組,什麼是字元串常量池
你看看String源碼就明白了,是對象!
s="123";
寫這句話的時候,會在常量池先找有沒有123這個字元串對象如果沒有,他就開始抽取,1,2,3
然後拼接成一個對象即:"123";
假如後面又來一個也需要這個對象,比如說s1="123";
這個時候在操作s1的時候還是先去常量池找有沒有這個對象,如果有,直接把地址拿過來,因為常量池數據為共享的,
假如這個時候s1="1234";那麼常量池是沒有的,就會重新抽取,1,2,3,4,然後重新拼接成一個新的對象放在常量池!
String源碼裡面有一個私有變數一個字元類型的數組,他就是用來抽取這些單個字元,然後拼接成
一個字元串對象!
I. 字元串常量池到底存放的是字元串引用還是字元串對象
引用,相同內容的字元串,會返回同一個引用
J. java中字元串的問題,兩個字元串常量池裡的字元串拼接在一起為什麼結果和我想的不一樣
首先比較的是 引用地址 而不是裡面的值。如果想比值就用equals。
字元串常量:由相同序列的字元組成的兩個字元串屬於同一對象,位於內存中的同一個位置。
所以在編譯期間a 是字元串常量"helloworld"的地址。
因為String c="hello"+"world";在編譯期間也能直接執行,故也是指向字元串常量"helloworld"的地址。
而b是在運行期間創建,這兩條語句所創建的"helloworld"字元串作為String對象存儲在內存中的一個獨立位置。
所以才有這個現象