前言
list是java重要的數據結構之一,我們經常接觸到的有arraylist、vector和linkedlist三種,他們都繼承來自java.util.collection接口,類圖如下
java 中經常需要使用到 list,下面簡單介紹幾種常見的初始化方式。
1.構造 list 后使用 list.add 初始化
這是最常規的做法,用起來不太方便。
2.使用 {{}} 雙括號語法
這種方式相對方便了一些。
外層的{}定義了一個 linkedlist 的匿名內部類。內層的{}的定義了一個實例初始化代碼塊。 這個代碼塊在初始化內部類時執行。所以這里相當于定義了一個匿名內部類,并使用add添加元素來初始化。
這種方式有幾個缺點:
使用匿名內部類,會有效率上的損失。當然在大多數情況下,這點效率都是可接受的。
靜態內部類持有所在外部類的引用。如果需要將 list 返回給到其他地方使用,可能造成內存泄漏。
3.使用 arrays.aslist
這種方式使用了 java.util.arrays 的靜態方法。寫法上比之前的兩種都更簡潔,也沒有構造匿名內部類的效率問題。
但也有幾點需要注意:
arrays.aslist 返回的是 arrays 的靜態內部類(靜態內部類不持有所在外部類的引用)。
這個內部類繼承自 abstractlist,實現了 randomaccess,內部使用了一個數組來存儲元素。但是不支持增刪元素。這點需要注意。如果只是使用 arrays.aslist 來初始化常量,那么這點就不算什么問題了。
arrays.aslist 的參數如果是基本類型的數組時,需要留意返回值可能和你預期的不同。
這里arrays.aslist(intarray)的返回值是list<int[]>而不是list<integer>。這一點也算不上問題,只是使用時需要留意。如果能在 java 中做到盡量使用 list 和 integer,盡量避免使用 int 等基本類型和[]這種較為底層的數據結構即可避免。
雖然本文是在講初始化list,但這里的{{}}雙括號語法同樣可用于初始化map等其他眾多類型。相對而言,arrays.aslist就只能用于初始化list類型了。
4. 使用 stream (jdk8)
使用了 jdk8 的 stream 來初始化。 單純初始化 list,使用 stream 有點大材小用了。
5. 使用 lists (jdk9)
這個和 arrays.aslist 一樣簡潔清晰。
總結:
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.jianshu.com/p/1841ebea43dc