1 回答

TA貢獻36條經(jīng)驗 獲得超15個贊
常量池你可以理解成 一塊內(nèi)存空間,
說明一個知識點, == 這個運算符號,如果a == b 是true的話,說明 a和b指向的同一個對象,兩個對象不相等的話他們運行 == 運行結(jié)果一定是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); /** ?*?輸出結(jié)果?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); /** ?*?輸出結(jié)果?false ?*/ } }
就拿Integer舉例說吧,上邊代碼?Integer i1 = 1; 當(dāng)i1創(chuàng)建出來的時候編譯器發(fā)現(xiàn)他在-128~127這個范圍里,所以會把它暫存在一塊固定的內(nèi)存中,當(dāng)你再定義 Integer i2 = 1的時候,編譯器會去常量池中找看看你之前有沒有定義過值為1的Integer對象,如果找到了就直接拿來用,沒有才會創(chuàng)建新的,所以 這里 i1 和i2指向了同一個對象,故System.out.println(i1 == i2); 為true, 如果你在后邊再創(chuàng)建i5, i6,i7,i8。。。創(chuàng)建多少個,它都指向這一個對象,他們進行==運算結(jié)果都是true
當(dāng)你定義i3 = 128時,編譯器發(fā)現(xiàn)他不在-128~127這個范圍內(nèi),因此就會直接new一個新的Integer對象出來,同理定義i4 = 128時也一樣,所以 i3 == i4運算結(jié)果為false
這樣做的目的是節(jié)省空間提高程序運行效率
題外話:如果想比較值的話 用?i3.intValue() == i4.intValue() 這樣結(jié)果是true
添加回答
舉報