最近在學習Java的集合架構部分,先從簡單一點的ArrayList開始吧!
1、什麼是ArrayList
ArrayList就是傳說中的動态數組,可以說是Array的複雜版本,它提供了如下一些好處:
- 動态的增加和減少元素。
- 實作了Collection和List接口。
- 靈活的設定數組的大小。
2、如何使用ArrayList
做一個簡單的測試:
import java.util.ArrayList;
public class ArrayList_Test {
public static void main(String[] args)
{
ArrayList arrayList = new ArrayList();
for(int i=0;i<11;i++)
arrayList.add(i*5);//給數組增加11個int元素
arrayList.remove(5);//将第6個元素移除
Object[] array = arrayList.toArray();
for(Object object:array)
{
System.out.println(object.toString());
}
}
}
輸出:
0
5
10
15
20
30
35
40
45
50
可能有人會疑惑,為什麼不直接把arrayList轉換成一個int數組呢?這樣不是更加友善嗎?當然是有原因的,因為ArrayList儲存的是Object對象,是以用arrayList.toArray()得到的是Object對象構成的數組,而且int隻是一個基本資料類型,并不是對象。那麼有人會問,可以轉換成int的封裝類Integer的對象數組啊,沒測試時,我也是這樣認為的,當我将Object[]強制類型轉換成Integer[]後,我運作程式時報錯了,就是下面的程式。
//報錯的程式:
import java.util.ArrayList;
public class ArrayList_Test {
public static void main(String[] args)
{
ArrayList arrayList = new ArrayList();
for(int i=0;i<11;i++)
arrayList.add(i*5);//給數組增加11個int元素
arrayList.remove(5);//将第6個元素移除
Integer[] array = (Integer[])arrayList.toArray();
for(Integer integer:array)
{
System.out.println(integer.intValue());
}
}
}
報錯:
java.lang.ClassCastException
。
百度一查是–強制類型轉換異常。
原因:
java.lang.ClassCastException
是進行強制類型轉換的時候産生的異常,強制類型轉換的前提是父類引用指向的對象的類型是子類的時候才可以進行強制類型轉換,如果父類引用指向的對象的類型不是子類的時候将産生
java.lang.ClassCastException
異常。
但是我們可以用範型去彌補這些不足:
import java.util.ArrayList;
public class ArrayList_Test {
public static void main(String[] args)
{
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for(int i=0;i<11;i++)
arrayList.add(i*5);//給數組增加11個int元素
arrayList.remove(5);//将第6個元素移除
for(Integer integer:arrayList)
{
System.out.println(integer.intValue());
}
}
}
3、ArrayList重要的方法和屬性
(1)構造器
ArrayList提供了三個構造器:
public ArrayList()
:預設的構造器,将會以預設(10)的大小來初始化内部的數組。
public ArrayList(Collection)
:用一個Collection對象來構造,并将該集合對象的元素添加到ArrayList。
public ArrayList(int)
:用指定的大小來初始化内部的數組。
(2)基本方法介紹:
下面是一些方法的介紹,後面出現的 ? 是“任意類”的意思,extends繼承不多說,E 是指定類型。
add(E o)
:将指定的元素追加到此清單的尾部。
add(int index, E element)
:将指定的元素插入此清單中的指定位置。
addAll(Collection< ? extends E> c)
:按照指定 Collection 的疊代器所傳回的元素順序,将該 Collection 中的所有元素追加到此清單的尾部。
addAll(int index, Collection< ? extends E> c)
:從指定的位置開始,将指定 Collection 中的所有元素插入到此清單中。
clear()
:移除此清單中的所有元素。
contains(Object elem)
:如果此清單中包含指定的元素,則傳回 true。
ensureCapacity(int minCapacity)
:如有必要,增加此 ArrayList 執行個體的容量,以確定它至少能夠容納最小容量參數所指定的元素數。
get(int index)
:傳回此清單中指定位置上的元素。
indexOf(Object elem)
:搜尋給定參數第一次出現的位置,使用 equals 方法進行相等性測試。
isEmpty()
:測試此清單中是否沒有元素。
lastIndexOf(Object elem)
:傳回指定的對象在清單中最後一次出現的位置索引。
remove(int index)
:移除此清單中指定位置上的元素。
remove(Object o)
:從此清單中移除指定元素的單個執行個體(如果存在),此操作是可選的。
set(int index, E element)
:用指定的元素替代此清單中指定位置上的元素。
size()
:傳回此清單中的元素數。
- 如果在初始化ArrayList的時候沒有指定初始化長度的話,預設的長度為10。
- ArrayList在增加新元素的時候如果超過了原始的容量的話,ArrayList擴容ensureCapacity的方案為“原始容量*3/2+1"。
- ArrayList是線程不安全的,在多線程的情況下不要使用。
- ArrayList實作周遊的幾種方法。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
//第一種周遊方法使用foreach周遊List
for (String str : list) {
//也可以改寫for(int i=0;i<list.size();i++)這種形式
System.out.println(str);
}
//第二種周遊,把連結清單變為數組相關的内容進行周遊
String[] strArray=new String[list.size()];
list.toArray(strArray);
//這裡也可以改寫為for(String str:strArray)這種形式
for(int i = 0 ; i < strArray.length() ; i++){
System.out.println(strArray[i]);
}
//第三種周遊 使用疊代器進行相關周遊
Iterator<String> ite=list.iterator();
while(ite.hasNext())
{
System.out.println(ite.next());
}
}
}