關於Arrays.asList()方法的思考

首先拋出一個問題,如圖,輸出結果是幾?

可能有人覺得是3,那麼繼續往下看

我們知道asList方法是接收一個數組參數,將他封裝成一個List,即

繼續看ArrayList的構造方法

 

至此發現,在List的底層,是用一個泛型數組接收數組參數,當數組參數的類型是int的時候(int[] args={1,2,3,4}),泛型並沒有識別出int類型,而是將int[]當做他的泛型.實際上是把args當做一個整體傳入.

所以,對於基本數據類型,asList將整體封裝成一個List元素,長度爲1.

 

現在討論另外一個問題,將int替換爲Integer,此時輸出結果是?

首先進入asList方法,看到返回結果爲ArrayList<>,但是當鼠標移到這個"ArrayList"上面時,發現他另有蹊蹺

正常的ArrayList應該是util下的,怎麼會是ArrayList下面?

通過查看ArrayList源代碼,發現

在Arrays內部重新定義了一個ArrayList內部類,而打開這個內部類的結構發現並沒有add方法.也就是說,雖然同樣是List,但是他沒有

重寫AbstractList類中的add方法,而只是單純的繼承,那麼在使用add方法時,就會去調用AbstractList中的add方法

因此,拋出異常.

同理,remove()也會拋出相同的錯誤,

觀察這個內部類的重寫方法,發現他在調用數組的方法,也就是說,其實他是個適配器,通過調用數組的方法,實現List的方法

底層操作對象其實是個數組.

即:asList()方法返回的List是定長的,不能增加和刪除的,底層實際上還是數組的一個虛假的"ArrayList"

總結,Arrays.asList()方法不能用於基本數據類型,返回結果不能再修改,其本質是頂着ArrayList的冒牌數組.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章