❶ 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);
提示:對象存在堆內存
❸ Java中的字元串常量池與Java中的堆和棧的區別
java常量池不在堆中也不在棧中,是獨立的內存空間管理。
1. 棧:存放基本類型的變數數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字元串常量對象存放在常量池中。)
2. 堆:存放所有new出來的對象。
3. 常量池:存放字元串常量和基本類型常量(public static final)。
對於字元串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字元串,在常量池中永遠只有一份,在堆中有多份。
❹ 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中字元串對象創建有兩種形式,一種為字面量形式,如String str = "droid";,另一種就是使用new這種標準的構造對象的方法,如String str = new String("droid");,這兩種方式我們在代碼編寫時都經常使用,尤其是字面量的方式。然而這兩種實現其實存在著一些性能和內存佔用的差別。這一切都是源於JVM為了減少字元串對象的重復創建,其維護了一個特殊的內存,這段內存被成為字元串常量池或者字元串字面量池。
❻ java常量池是什麼
常量池(constant pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。它包括了關於類、方法、介面等中的常量,也包括字元串常量。
❼ 求教 java 字元串緩沖區和常量池有什麼關聯、關系
java里的堆棧,常量池,用圖形來表示的話會好理解下,不過不會上傳圖片,就簡單的用文字描述下,希望能幫助你理解.
首先,java里new出來的對象都會存放在堆里.棧里可以存放對這些對象的指針的引用.
例如: A a=new A();
這里new出來的A對象會被存放在堆中,而 a呢.會被存放到棧里,並且保存了對A這個對象引用的地址.
棧的存放順序是後進先出,如果你接觸過數據結構的課程的話,這個並不難理解.
至於字元串池,是用來存放一些字元和棧和堆的關系,我們只需要這么理解,當我們創建一個字元串時,java會先在字元串池裡尋找有沒有你要創建的字元串.
例如: String a="你好";
先尋找字元串池裡有沒有 "你好" 這個字元串,如果存在,就不會在堆中再創建.
如果不存在,就會在堆中創建 "你好" 這個字元串 並在棧中生成 a保存對其的地址引用 然後還會將新創建的字元串"你好" 保存到字元串池中.
❽ Java String常量池
String s = new String("abc");
這兒事實上有兩個String對象;第一個String是"abc"對象,是對象本身,儲存在常量區,另一個是new為對象S申請的空間,而它是一個內存地址但是指向abc,你的理解是對的。