亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

下面這圖里,最后一段話,看不懂啊,大神打點代碼演示看看啊

下面這圖里,最后一段話,看不懂啊,大神打點代碼演示看看啊

fenkapian 2017-04-09 20:10:04
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

查看完整回答
反對 回復 2017-04-19
  • fenkapian
    fenkapian
    非常感謝
  • fenkapian
    fenkapian
    等等,為什么非得在-128-127呢,這不是byte的范圍嗎,int的范圍不是21億多嗎
  • frece
    frece
    并不是他范圍多大就設置多大,常量池這個東西創建出來是為了節省空間的,即便是-128~127的這個范圍,他也能存256個數字,你像其他的Short,Long也要分配一部分內存,還有String也有常量池,如果范圍太大的話,那不就失去了“節省內存”的意義了嗎?
  • 1 回答
  • 0 關注
  • 1259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號