關(guān)于 Java 字符串 String 有一道很基礎(chǔ)的面試題烘嘱,相信很多人都遇到過昆禽,就是 String s = "a" 和 String s = new String("a") 的區(qū)別是什么?相信大家都能回答上來蝇庭。那么你知道這三者有什么區(qū)別么醉鳖?
Integer i = new Integer(1) ;
Integer i = Integer.valueOf(1) ;
Integer i = 1 ;
new Integer(1) 與 Integer.valueOf(1)
new Integer(1) :會新建一個對象;
Integer.valueOf(1) :使用對象池中的對象哮内,如果多次調(diào)用盗棵,會取得同一個對象的引用。
對象池機(jī)制
為了提高性能北发,Java 在 1.5 以后針對八種基本類型的包裝類纹因,提供了和 String 類一樣的對象池機(jī)制;讓我們看一下 Integer.valueOf(int i) 的源碼琳拨,就很容易理解了:
- Integer.valueOf() 中有個內(nèi)部類 IntegerCache瞭恰,類似于一個常量數(shù)組,也叫對象池狱庇,它維護(hù)了一個 Integer 數(shù)組 cache碳抄,長度為(128+127+1)=256记某,意味著 Integer 緩存池的大小默認(rèn)為 -128 ~ 127 衅鹿;
- Integer類中還有一個靜態(tài)代碼塊,默認(rèn)創(chuàng)建了數(shù)值【-128-127】的 Integer 緩存數(shù)據(jù)偷俭;所以當(dāng) - Integer.valueOf(1) 的時候,會直接在該在對象池找到該值的引用缰盏;
- 在 jdk 1.8 中社搅,在啟動 JVM 的時候,可以通過配置來指定這個緩沖池的大小乳规。
Integer i = 1 與 Integer.valueOf(1)
Integer i = 1 ; 這種寫法叫做裝箱(基本類型與其對應(yīng)的包裝類型之間的賦值使用自動裝箱與拆箱完成)形葬,而裝箱操作是通過 Integer.valueOf(1) 完成的,所以:
Integer i = 1 等同于 Integer.valueOf(1)
其他基本類型對應(yīng)的緩沖池
- Boolean:true , false
- Short, Int, Long:-128 ~ 127
- Byte, Character : \u0000 到 \u007F暮的,也就是 0 ~ 127