“我在這裡。”
“嗨,艾莉!”
“今天我們要聊一個有趣的話題,我要給大家講講ArrayList這個類。”
“一個新類?酷!它能做什麼?”
“讓我從背景說起。程序員唯一不喜歡數組的地方就是你不能改變它們的大小。如果你需要向一個只有一個空閒槽的數組添加三個以上的元素,你會怎麼做? ”
“解決這個問題的唯一方法是創建非常大的數組,以保證你有足夠的空間容納所有元素。然而,這通常意味著浪費內存。如果一個數組通常包含三個元素,但即使是最小的機會它可能需要容納 100 個元素,因此您必須創建一個包含 100 個元素的數組。”
“那麼,程序員想出了什麼?”
“他們編寫了ArrayList類,它做的事情與 Array 相同,但它可以改變它的大小。”
“有趣的舉動。他們是怎麼做到的?”
“每個ArrayList對像都存儲一個常規的元素數組。當您從 ArrayList 讀取元素時,它會從其內部數組中讀取它們。當您將它們寫入 ArrayList 時,它會將它們寫入其內部數組。在這裡,比較這些列:”
大批 | 數組列表 |
---|---|
為元素創建容器 | |
|
|
獲取元素個數 | |
|
|
從數組/集合中獲取元素 | |
|
|
將一個元素寫入數組 | |
|
|
“那麼,為什麼 ArrayList 更好?據我所知,代碼現在更長了。”
“首先,ArrayList支持程序員必須一直執行的幾個額外操作。普通數組不支持這些操作。例如,從數組中間插入或刪除元素而不留空洞。 ”
“其次,改變數組大小的能力。當你需要添加一個元素但內部數組沒有任何空閒槽時,這是 ArrayList 內部發生的事情:
a)創建另一個數組,它比當前內部數組大 50%,外加一個元素。
b)舊數組中的所有元素都被複製到新數組中。
c)新數組保存為 ArrayList 對象的內部數組。舊數組被聲明為垃圾(我們只是停止存儲對它的引用)。”
大批 | 數組列表 |
---|---|
在數組末尾添加一個元素 | |
不支持此操作 |
|
在數組中間添加一個元素 | |
不支持此操作 |
|
在數組開頭添加一個元素 | |
不支持此操作 |
|
從數組中刪除一個元素 | |
我們可以用刪除一個元素list[3] = null 。但這會在數組中留下一個“洞”。 |
|
“我們如何使用這個 ArrayList?”
“實際上,就像我們對普通數組所做的那樣。看。讓我們將使用 ArrayList 與使用數組進行比較。假設我們需要‘讀入 10 個字符串並以相反的順序將它們顯示在屏幕上’。”
“看這個:
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);
// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
String s = reader.readLine();
list[i] = s;
}
// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
int j = list.length - i - 1;
System.out.println( list[j] );
}
}
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);
// Read strings from the keyboard
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++)
{
String s = reader.readLine();
list.add(s);
}
// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
int j = list.size() - i - 1;
System.out.println( list.get(j) );
}
}
我在每一欄中使用相同的顏色來突出顯示類似的操作。”
“一方面,一切都不一樣了。另一方面,還是一樣。”
“對。除了我們在使用ArrayList時不使用方括號。相反,我們使用get、set和add方法。”
“是的,我收集了這麼多。不過,它看起來非常相似。”
GO TO FULL VERSION