我的疑問是,我們已經爲100個元素分配了內存,如果我們用戶方法2,我們是不是創建一個更多的內存區域並將其分配給intArr1?
您在new Integer[100]
中分配的內存用於數組將包含的100個對象引用,而不是其包含的對象。當添加到數組中時,由於它是一個對象數組,因此您仍然必須創建該對象。
你的方法其實本質上是幕後相同,因爲編譯器會自動「盒子」,通過Integer.valueOf(1)
1
的方法1,更改:
intArr[1] = 1;
到
intArr[1] = Integer.valueOf(1);
(即使不依靠自動裝箱,Integer.valueOf
通常是獲得Integer
實例的更好方法,因爲它可以緩存它們[並且始終緩存實例,以便從-128到127]。)
讓我們跟隨它通過與一些ASCII藝術:
當你這樣做:
Integer[] intArr;
你有記憶是這樣的:
intArr[null]
例如,含有null
變量。現在你分配的內存陣列,並將其賦值給變量:
intArr = new Integer[100];
,你會得到這樣的事情:
+−−−−−−−−−−−−−−−−+
intArr[Ref21345]−−−−>| Integer[100] |
+−−−−−−−−−−−−−−−−+
| 0: null |
| 1: null |
| ... |
| 99: null |
+−−−−−−−−−−−−−−−−+
現在我們有空間來存儲100所對象引用;他們都從null
開始。然後,你做:
intArr[0] = 1;
,編譯器變成
intArr[0] = Integer.valueOf(1);
,你會得到:
+−−−−−−−−−−−−−−−−+
intArr[Ref21345]−−−−>| Integer[100] |
+−−−−−−−−−−−−−−−−+ +−−−−−−−−−−+
| 0: [Ref84651] |−−−−>| Integer |
| 1: null | +−−−−−−−−−−+
| ... | | value: 1 |
| 99: null | +−−−−−−−−−−+
+−−−−−−−−−−−−−−−−+
*這兩行大致相同*功能上。但實際上,直接調用Integer構造函數的原因很少。 – shmosel
@shmosel:是的 - 因此下面的段落。 (我「廣泛地」改爲「稍微」) –
非常感謝幫助解決這個疑問,清除了它。 – CuriousMind