Collection框架和List集合
集合框架中包含了一系列不同數據結構(線性表,查找表...),是用來保存一組數據的結構。
Collection下面有兩個自接口:List和Set.
List和Set最重要的區別在於:
1)、List可以重複存放同一個元素,而Set不行。所以List是可重複集,Set是不可重複集。
2)、List是有序集合,可以通過索引使用元素;而Set是無序集合。
List下常用有ArrayList,LinkedList。
Set下有HashSet和TreeSet等。
1、Collection常用方法
int size():返回集合裏邊包含的對象個數
boolean isEmpty():是否爲空(不是null而是裏邊沒有元素)
boolean contains(Object o):是否包含指定對象
boolean clear():清空集合
boolean add(E e):向集合中添加對象
boolean remove(Object o):移出某個對象
boolean addAll(Collection <?extends E> c):將另一個集合中的所有元素添加到集合中。
boolean removeAll(Collection<?> c):移出集合中與另一個集合中相同的全部元素。
Iterator<E> iterator():返回該集合的對應的迭代器。
例:
List list1 = new ArrayList(); List list2 = new ArrayList(); List list3 = new ArrayList(); list1.add("1"); list1.add("2"); list1.add("3"); list2.add("4"); list2.add("5"); list3.add("1"); list3.add("2"); list1.addAll(list2); System.out.println("list1"+list1); //{1,2,3,4,5} list1.removeAll(list3); //刪除交集的部分 System.out.println("list1"+list1); //{3,4,5} /** 只保留和給定集合元素相同的元素,其餘的刪掉。保留交集部分 */ list1.retainAll(list2); System.out.println("list1"+list1);//{4,5}
2、ArrayList和LinkedList
List接口是Collection的子接口,用於定義線性表數據結構,可以將List理解爲存放對象的數組,只不過元素的個數可以動態增加或者減少。
List接口最常見的實現類爲ArrayList和LinkedList,分別用動態數組和鏈表的方式實現了List接口。
可以認爲他們的方法在邏輯上完全一樣,只是在性能上有差別,ArrayList更適合於隨機訪問,而LinkedList更適合於插入和刪除,在性能不是特別要求情況下可以忽略這個差別。
1)ArrayList——動態數組實現(自動擴容/維護)的List:可以通過下標迅速的索引到對應的元素,但是在刪除和插入時移動較多元素。
2)LinkedList——鏈表實現的List:在插入和刪除時只需要改變連接“指針”即可實現。
由於我們可以任意添加不同的對象,這樣添加很方便,但是在獲取時容易出現“類造型異常”。
獲取元素時,得到的都是Object,若要轉換成實際類,就要造型。
在造型之前需要判斷,否則就會出現造型異常ClassCastException。通常我們使用的是一種類型的對象。
3、List常用方法
1)ArrayList重寫的toString()方法依次調用了它所包含對象的toString()方法,而且Point類也重寫它的toString()方法。
2)List實現類的contains方法用於判斷集合中是否包含某一個對象,具體的邏輯是:依次調用集合所包含對象的equals方法與判斷對象比較,如果有返回true則包含。因此,至於集合中的對象應妥善的重寫equals方法,就Point而言,如果重寫了equals方法,且邏輯是x,y全部相同則返回true,則list.contains(p)將返回true.
3)remove方法同樣和集合中對象的equals方法相關,首先通過調用equals方法找到對象,然後再刪除。
4、基於下標的get和set方法
List除了繼承Collection定義的方法外,還根據線性表的數據結構定義了一系列方法。
1)get(int index)方法,獲取集合中索引的元素。
注:這個方法是List中獨有的,返回的是Object
2)Object set(int index,Object obj):將給定的元素替換集合中索引爲index的元素,返回的是被替換的元素。
3)add和remove有方法重載
add(int index, Object obj):將給定的元素插入索引處,原位置上及後面的元素順序向後移(插隊)。
Object remove(int index):刪除指定索引處的元素,該方法的返回只是被刪除的元素。
第17個、
5、List其他常用方法
List還提供類似String的indexOf和lastIndexOf方法,用於在集合中檢索某個對象,其判斷邏輯爲:(o==null?get(i)==null:o.equals(get(i)))
1)int indexOf(Object obj):返回首次在集合中出現該元素的索引值。
2)lastIndexOf(Object obj):返回最後一次在集合中出現該元素的索引值。
還有可以將集合轉換爲數組的方法:
3)toArray():將集合轉化爲數組。這裏參數僅僅是告知集合要轉換的數組類型,並不會使用我們提供的數組,所以不需要給長度。
集合中的元素應爲同一個類型。
String[] array = (String[])list.toArray(new String[0]);
6、迭代器
所有的Collection的實現類都實現了其iterator方法,該方法返回一個Iterator接口類型對象,用於實現集合元素的迭代遍歷。
Iterator定義有三個方法:
boolean hasNext():判斷指針後邊是否有元素,是否還有未迭代的元素。
E next():指針後移,返回當前的元素。
void remove():在原集合中刪除剛剛返回的元素。
每次next方法調用完成後只能調用一次remove方法,該方法刪除剛剛next方法返回的元素。
在迭代的過程中不能調用集合的remove等方法刪除元素,否則會有ConcrrentModificationException異常。
注:
對於List而言,可以通過基於下標的get方法進行遍歷,而iterator方法是針對Collection接口設計,所有實現了Collection接口的類都可以使用 Iterator實現迭代遍歷。例:
List list = new ArrayList(); list.add("1"); list.add("2"); list.add("%"); list.add("%"); list.add("2"); list.add("1"); Iterator it = list.iterator();//實例迭代器對象 while (it.hasNext()){ //使用hasNext()方法判斷是夠還有未迭代的元素 String str = (String)it.next();//調用next返回該元素 if ("%".equals(str)) { it.remove(); /* 每次next方法調用完成後只能調用一次remove方法,該方法刪除剛剛next方法返回的元素。 * 在迭代的過程中不能調用集合的remove等方法刪除元素,否則會有ConcrrentModificationException異常。 */ //list.remove(str);//錯誤,會出現異常*** } } System.out.println(list);//迭代後輸出集合 //也可以使用for來迭代 /*for (Iterator iterator = list.iterator(); iterator.hasNext();) { String str = (String) iterator.next(); System.out.println(str); }*/
迭代器在迭代元素時要求不能對該集合的元素進行改變,就如上面不能使用集合的remove等方法刪除元素,否則會有ConcrrentModificationException異常。