資料內(nèi)容:
1.2. new ArrayList
上面的數(shù)組轉(zhuǎn)list方式雖然是最簡(jiǎn)單的,但不一定是合適的,特別是當(dāng)我們可能對(duì)轉(zhuǎn)換后的list進(jìn)行
操作時(shí),可能埋坑(而且這種坑還非常隱晦,代碼層面上很難發(fā)現(xiàn))
為了減少在代碼里面下毒的可能性,不妨使用下面這種方式 new ArrayList<>
(Arrays.asList(ary))String[] ary = new String[]{ "1", "a"};
List<String> out = new ArrayList<>(Arrays.asList(ary));
out.add("hello");
System.out.println(out);
通過上面這種方式創(chuàng)建的List,就是我們熟知的 ArrayList 了
避雷預(yù)警
看到上面這個(gè)使用姿勢(shì),就很容易想到一個(gè)常見的踩雷點(diǎn),比如我們的應(yīng)用中,有一個(gè)全局共享
的配置列表,張三需要拿id為奇數(shù)的配置,李四拿id為偶數(shù)的配置,然后他們都是這么做的
list.removeIf(s -> s.id % 2 == 0);
然后跑了一次之后發(fā)現(xiàn)這個(gè)全局的列表清空了,這就是典型的沒有做好資源隔離的case了,針對(duì)
這種場(chǎng)景,要么是限制使用方,直接針對(duì)全局的資源進(jìn)行修改,要么就是使用方拿到的是一個(gè)隔
離的備份
禁止修改:
使用不可變的容器,如前面提到的 java.util.Arrays.ArrayList ()
使用 Collections.unmodifiableList 創(chuàng)建
List<String> unModifyList = Collections.unmodifiableList(out);
列表拷貝
new ArrayList<>(Arrays.asList(ary));
(上面這種屬于深拷貝的實(shí)現(xiàn),具體可以看一下jdk的源碼實(shí)現(xiàn))
1.3. Collections.addAll
第三種方式借助jdk提供的容器工具類 Collections 來實(shí)現(xiàn)