java的八種基本類型(Byte?
Short、Integer、Long、Character、Boolean、Float、Double),除Float及Double意外,其它六種都實現了常量池,
但是他們只在大于等于-128且小于等于127時才能使用常量池,如果不在此范圍內,則會new一個出來,保存在堆內存中。
1 回答
已采納

frece
TA貢獻36條經驗 獲得超15個贊
常量池你可以理解成 一塊內存空間,
說明一個知識點, == 這個運算符號,如果a == b 是true的話,說明 a和b指向的同一個對象,兩個對象不相等的話他們運行 == 運行結果一定是false(注意是對象不相等不是值不相等)
下面 上代碼:
public?class?Test?{ public?static?void?main(String[]?args)?{ Integer?i1?=?1; Integer?i2?=?1; //i2在-128~127?直間,等價于?i2?=?i1 System.out.println(i1?==?i2); /** ?*?輸出結果?true ?*/ Integer?i3?=?128;?//?i3?不在-128~127?直間,等價于?i3?=?new?Integer(128); Integer?i4?=?128;//??i4?不在-128~127?直間,等價于?i4?=?new?Integer(128); System.out.println(i3?==?i4); /** ?*?輸出結果?false ?*/ } }
就拿Integer舉例說吧,上邊代碼?Integer i1 = 1; 當i1創建出來的時候編譯器發現他在-128~127這個范圍里,所以會把它暫存在一塊固定的內存中,當你再定義 Integer i2 = 1的時候,編譯器會去常量池中找看看你之前有沒有定義過值為1的Integer對象,如果找到了就直接拿來用,沒有才會創建新的,所以 這里 i1 和i2指向了同一個對象,故System.out.println(i1 == i2); 為true, 如果你在后邊再創建i5, i6,i7,i8。。。創建多少個,它都指向這一個對象,他們進行==運算結果都是true
當你定義i3 = 128時,編譯器發現他不在-128~127這個范圍內,因此就會直接new一個新的Integer對象出來,同理定義i4 = 128時也一樣,所以 i3 == i4運算結果為false
這樣做的目的是節省空間提高程序運行效率
題外話:如果想比較值的話 用?i3.intValue() == i4.intValue() 這樣結果是true
添加回答
舉報
0/150
提交
取消