廢話不多說,上代碼
public class ArrayListTest {
@Test
public void testList() {
List<Long> longList = new ArrayList<>();
longList.add(1L);
longList.add(2L);
longList.add(3L);
longList.add(4L);
longList.forEach(System.out::println);
System.out.println("----------------------------------");
List<Long> longList2 = Arrays.asList(1L, 2L, 3L);
longList2.add(4L);
longList2.forEach(System.out::println);
}
}
運行之后,你會看到如下結果

瞬間感覺到自己窒息了有么有,是不是不敢相信自己的眼睛啊,趕緊再運行一次,結果還是一樣,就如下。

但是,憤怒歸憤怒,還得解決不是,那咱們就來看看吧。
我們知道,longList
是我們自己定義的一個 java.util.ArrayList
,我們來看java.util.ArrayList
的部分結構

會發現它其實重寫了add
方法,那我們調用add
方法添加元素,是沒有任何毛病的,想怎么玩就怎么玩。
那咱們接下來看看Arrays.asList
這貨發生了什么。
我們進入方法看看實現

看到它返回了一個ArrayList
,是不是感覺也沒什么違和的,然后你就又急了,估計我要是在你面前,你就是這個表情。

別着急,別着急,重點來了。

來來來,看注釋,為什么說返回的這貨是一個有着list
外表的array
呢,那我們就進去看看。

進來之后你就感覺怪怪的,具體怪在哪兒吧,也說不上來,感覺看着這個包怎么那么欠抽呢。

嗷~~~,猛然想了一下,我們經常用到的好像是java.util.ArrayList
啊,這貨竟然是java.util.Arrays.ArrayList
這么一想就明白了,為什么作者說這貨就是“披着羊皮的狼外婆”呢,呃呃,不對,是“披着list
外皮的array
”。
然后我們再看看這貨的結構。
不用找了,我不會給你截圖的,這貨方法還是很多的,截圖有點費勁。但是你肯定找不到add
方法。
然后你就“頓悟”了,哦,原來這貨壓根就不讓我添加元素啊。

聰明如你,當以后用到這種情況的時候就知道該怎么做了吧。
因為你看到的白羊可能不是真正的白羊,可能只是披了一張白羊皮的狼外婆。