㈠ 求教 java 字元串緩沖區和常量池有什麼關聯、關系
java里的堆棧,常量池,用圖形來表示的話會好理解下,不過不會上傳圖片,就簡單的用文字描述下,希望能幫助你理解.
首先,java里new出來的對象都會存放在堆里.棧里可以存放對這些對象的指針的引用.
例如: A a=new A();
這里new出來的A對象會被存放在堆中,而 a呢.會被存放到棧里,並且保存了對A這個對象引用的地址.
棧的存放順序是後進先出,如果你接觸過數據結構的課程的話,這個並不難理解.
至於字元串池,是用來存放一些字元和棧和堆的關系,我們只需要這么理解,當我們創建一個字元串時,java會先在字元串池裡尋找有沒有你要創建的字元串.
例如: String a="你好";
先尋找字元串池裡有沒有 "你好" 這個字元串,如果存在,就不會在堆中再創建.
如果不存在,就會在堆中創建 "你好" 這個字元串 並在棧中生成 a保存對其的地址引用 然後還會將新創建的字元串"你好" 保存到字元串池中.
㈡ Java String常量池在什麼位置
常量池只有一個。
string a = "abc"//現在常量池裡找abc,有的話就把a指向它,沒有的話就新建 這是在編譯期間做的
string b = new string("abc");//直接新建一個abc,並把地址給b,這是在運行期間做的
a == b //判斷a和b的地址是否相等,明顯不相等。
a.equals(b)//判斷a和b指向的字元串常量是否相等,都是"abc",所以是true
㈢ Java中,這些字元串什麼時候進入常量池的
Java中字元串對象創建有兩種形式,一種為字面量形式,如String str = "droid";,另一種就是使用new這種標準的構造對象的方法,如String str = new String("droid");,這兩種方式我們在代碼編寫時都經常使用,尤其是字面量的方式。然而這兩種實現其實存在著一些性能和內存佔用的差別。這一切都是源於JVM為了減少字元串對象的重復創建,其維護了一個特殊的內存,這段內存被成為字元串常量池或者字元串字面量池。
㈣ java中的字元串到底是在方法區的常量池裡還是new出來的對象里
String str ="nihao";
當這段代碼編譯的時候,首先它會去堆里的方法區常量池裡去查找,如果有一個同樣的字元串「nihao」,存在,那麼它會把當前聲明的對象的地址指向那個字元串對象,調用的是String.itern()方法。如果沒有的話,它會開啟堆內存,分割一塊新的地址指向str對象。
String是不可變的(final的),不必擔心穩定性問題。
而當你新new一個String數組的時候,當你給String數組賦值的時候,它同樣遵循這個原理。
這樣做的好處:字元串多重利用,防止產生冗餘。
詳情參考jdk中String類的的itern方法:
public String intern()
返回字元串對象的規范化表示形式。
一個初始為空的字元串池,它由類 String 私有地維護。
當調用 intern 方法時,如果池已經包含一個等於此 String 對象的字元串(用 equals(Object) 方法確定),則返回池中的字元串。否則,將此 String 對象添加到池中,並返回此 String 對象的引用。
它遵循以下規則:對於任意兩個字元串 s 和 t,當且僅當
s.equals(t) 為 true 時,s.intern()==t.intern() 才為 true。
所有字面值字元串和字元串賦值常量表達式都使用 intern 方法進行操作。
㈤ Java中的字元串常量池與Java中的堆和棧的區別
java常量池不在堆中也不在棧中,是獨立的內存空間管理。
1. 棧:存放基本類型的變數數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字元串常量對象存放在常量池中。)
2. 堆:存放所有new出來的對象。
3. 常量池:存放字元串常量和基本類型常量(public static final)。
對於字元串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字元串,在常量池中永遠只有一份,在堆中有多份。
㈥ 我想問一下Java通過new String創建字元串會被保存都常量池中嗎
厚顏無恥的復制下
方式一:String a = 「aaa」 ;
方式二:String b = new String(「aaa」);
兩種方式都能創建字元串對象,但方式一要比方式二更優。
因為字元串是保存在常量池中的,而通過new創建的對象會存放在堆內存中。
常量池中已經有字元串常量」aaa」
通過方式一創建對象,程序運行時會在常量池中查找」aaa」字元串,將找到的」aaa」字元串的地址賦給a。
通過方式二創建對象,無論常量池中有沒有」aaa」字元串,程序都會在堆內存中開辟一片新空間存放新對象。
常量池中沒有字元串常量」aaa」
通過方式一創建對象,程序運行時會將」aaa」字元串放進常量池,再將其地址賦給a。
通過方式二創建對象,程序會在堆內存中開辟一片新空間存放新對象,同時會將」aaa」字元串放入常量池,相當於創建了兩個對象。
㈦ Java常量池是什麼有什麼用 和堆、棧有關系求簡單易懂的解釋!
1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.
2. 棧:存放基本類型的變數數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字元串常量對象存放在常量池中。)
3. 堆:存放所有new出來的對象。
4. 靜態域:存放靜態成員(static定義的)
5. 常量池:存放字元串常量和基本類型常量(public static final)。
6. 非RAM存儲:硬碟等永久存儲空間
這里我們主要關心棧,堆和常量池,對於棧和常量池中的對象可以共享,對於堆中的對象不可以共享。棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命周期不需要確定,具有很大的靈活性。
對於字元串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字元串,在常量池中永遠只有一份,在堆中有多份。
㈧ Java中的幾種常量池
字元串常量池:當類載入完成,在堆中生成字元串對象實例,然後將該字元串對象實例的引用值存到string pool中。
class文件常量池:用於存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References)。
運行時常量池:當類載入到內存中後,jvm就會將class常量池中的內容存放到運行時常量池中。
㈨ java字元串常量池問題
程序運行時的任何數據都存放在程序內存中,程序結束後程序內存被回收,其中的任何數據都不再存在。
㈩ java8字元串常量池在哪
首先你要知道jvm常量池也是對象池,它和在堆中的存儲沒有區別(底層存儲都是一樣的,只是對象之間的引用有差別)。那為什麼要有常量池呢?因為它可以節省時間和空間,當需要一個對象的時候,可以直接從常量池中獲取,而不需要重新創建,這樣也就節省了時間和空間(常量池判斷對象是否存在應該是equals方法)。
除了String外,Java的8種基本類型(Byte, Short, Integer, Long, Character, Boolean, Float, Double)除Float和Double以外,其它六種都實現了常量池。
樓主這么好學,我出個題目給樓主:
Integer i = 127;
Integer j = 127;
System.out.println(i == j);
提示:對象存在常量池
Integer m = 128;
Integer n = 128;
System.out.println(m == n);
提示:對象存在堆內存