簡(jiǎn)單介紹List和數(shù)組轉(zhuǎn)List集合
摘要:介紹List接口和創(chuàng)建List對(duì)象的三個(gè)常用方法,介紹數(shù)組轉(zhuǎn)換List的幾種方法。
綜述
??線性列表List是一個(gè)接口,繼承自接口Collection,習(xí)慣性地會(huì)將實(shí)現(xiàn)了List接口的對(duì)象稱為L(zhǎng)ist集合。List有兩個(gè)常用的實(shí)現(xiàn)類ArrayList和LinkedList,在開發(fā)中使用率最多的是可以動(dòng)態(tài)擴(kuò)容的ArrayList。ArrayList 底層是數(shù)組結(jié)構(gòu),查詢快,增刪慢;LinkedList 底層結(jié)構(gòu)是鏈表,查詢慢,增刪快。從功能特性上來看,List是有序、可重復(fù)的單列集合,集合中的每個(gè)元素都有對(duì)應(yīng)的順序索引,可以通過該索引來精確地控制指定位置上的元素。默認(rèn)情況下,List會(huì)按元素的添加順序給元素設(shè)置索引,第一個(gè)添加到List集合中的元素索引為0,第二個(gè)為1,以此類推可以得到后面元素的索引。所以List和數(shù)組的行為幾乎相同,都是有序的存儲(chǔ)結(jié)構(gòu)。
如何創(chuàng)建List
??下面是創(chuàng)建List的三種常見方法:
- 通過多態(tài)方式:new + List的某個(gè)子類,譬如
new ArrayList()等; - List.of():of()方法可以根據(jù)給定的元素快速創(chuàng)建一個(gè)只讀的List對(duì)象,但該方法不接受null元素,如果傳入null會(huì)拋出NullPointerException異常。
- Guava Lists工具類:使用方法為
List<Integer> list = Lists.newArrayList(32, 0, 77, 90, 700, 132, 5, 36);,需要引入的guava包如下:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava-parent</artifactId>
<version>32.0.0-jre</version>
</dependency>
六種數(shù)組轉(zhuǎn)List的方法
??在工作中,經(jīng)常遇到需要對(duì)List與數(shù)組互相轉(zhuǎn)換的場(chǎng)景,因而本文介紹幾種數(shù)組轉(zhuǎn)換為L(zhǎng)ist的方法。下文使用的測(cè)試用例若無特殊說明,都基于如下數(shù)組:
Integer[] arr = {32, 0, 77, 90, 700, 132, 5, 36};
for循環(huán)遍歷
??通過for循環(huán)遍歷把元素添加到list集合是最基礎(chǔ)的一種操作:
List<Integer> list = new ArrayList<>();
for (int one : arr) {
list.add(one);
}
Arrays.asList()
??數(shù)組泛型如果是基礎(chǔ)數(shù)據(jù)類型,需要轉(zhuǎn)為引用數(shù)據(jù)類型,如int 轉(zhuǎn)為Integer。如果直接使用基礎(chǔ)數(shù)據(jù)類型,那么輸出的是地址,因?yàn)閘ist集合存放的是數(shù)組。下面的示例是可以順利轉(zhuǎn)換的:
//集合封裝的是ints
List<Integer> ints = Arrays.asList(arr);
Arrays.asList(arr).forEach(System.out::println);
??函數(shù)Arrays.asList(array) 返回的、只讀的List對(duì)象是由原始數(shù)組構(gòu)成的、固定大小的列表,實(shí)現(xiàn)類是 java.util.Arrays 類中一個(gè)私有靜態(tài)內(nèi)部類 java.util.Arrays.ArrayList。java.util.Arrays.ArrayList 類封裝了 set()、get()和contains() 等方法,但是沒有 add()和remove() 方法,所以調(diào)用add() 或remove() 方法會(huì)拋出異常UnsupportedOperationException。
new ArrayList<>(Arrays.asList(array))
??這樣定義的List可以進(jìn)行增刪操作,推薦這么轉(zhuǎn)換。
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
list.forEach(System.out::println);
??此轉(zhuǎn)換方法創(chuàng)建了一個(gè)新的List集合,對(duì)集合的修改不會(huì)改變數(shù)組里的值。
Collections.addAll()
??通過集合工具類Collections.addAll()方法轉(zhuǎn)換:
List<Integer> list = new ArrayList<>(arr.length);
Collections.addAll(list, arr);
list.add(897);
list.forEach(System.out::println);
??根據(jù)數(shù)組長(zhǎng)度創(chuàng)建一個(gè)相同長(zhǎng)度的list,然后通過Collections.addAll()函數(shù)把數(shù)組里的元素添加到list里(最高效)。這樣得到的對(duì)象可以直接添加或者刪除元素。
stream流collect方法
??可以使用流stream將下列三種數(shù)組轉(zhuǎn)換為L(zhǎng)ist——Integer[]、Long[]、Double[]。
List<Integer> list = Arrays.stream(arr).collect(Collectors.toList());
list.add(897);
list.forEach(System.out::println);
??在Java 8中,可以使用如下裝箱方法把基礎(chǔ)數(shù)據(jù)類型數(shù)組int[]、long[]、double[]轉(zhuǎn)換成List集合,但是其它數(shù)據(jù)類型比如short[]、byte[]、char[],暫不支持。
List<Integer> list = Arrays.stream(new int[] {1, 2, 3}).boxed().collect(Collectors.toList());
list.add(777);
list.forEach(System.out::println);
??備注:為什么int[]不能直接轉(zhuǎn)為L(zhǎng)ist,而Integer[]可以轉(zhuǎn)為L(zhǎng)ist?因?yàn)長(zhǎng)ist的泛型必須是引用類型。
Stream.of
??通過Stream.of方法轉(zhuǎn)換為L(zhǎng)ist:
List<Integer> list = Stream.of(arr).collect(Collectors.toList());
list.add(7779);
list.forEach(System.out::println);
結(jié)束語
??如果大家對(duì)上述文章有好的建議,歡迎在評(píng)論區(qū)留言,樓蘭胡楊會(huì)虛心接受、認(rèn)真聆聽、積極反饋。
Buy me a coffee. ?Get red packets.
浙公網(wǎng)安備 33010602011771號(hào)