集合Collection
集合類的作用:方便操作多個對象。
集合與數組之間的區別:
(1): 長度區別:
數組的長度是固定的而集合的長度是可變的
(2): 存儲數據類型的區別:
數組可以存儲基本數據類型 , 也可以存儲引用數據類型; 而集合只能存儲引用數據類型
(3): 內容區別:
數組只能存儲同種數據類型的元素 ,集合可以存儲不同類型的元素
1.Collection集合的功能(方法)概述
Collection集合的方法 | 概述 |
---|---|
boolean add(Object obj) | 添加一個元素 |
boolean addAll(Collection c) | 添加一個集合的元素 |
void clear() | 移除所有元素 |
boolean removeAll(Collection c) | 刪除的元素是兩個集合的交集元素 |
boolean remove(Object o) | 移除一個元素 |
boolean contains(Object o) | 判斷集合中是否包含指定的元素 |
boolean containsAll(Collection c) | 判斷這個集合 是否包含 另一個集合中所有的元素 |
boolean isEmpty() | 判斷集合是否爲空 |
int size() | 元素的個數 |
2.迭代器(Iterator):用來遍歷數據結構
public class MyTest {
public static void main(String[] args) {
Collection collection1 = new ArrayList();
collection1.add("美國隊長");
collection1.add("鋼鐵俠");
collection1.add("雷神");
collection1.add("黑寡婦");
Iterator iterator = collection1.iterator();
Object next = iterator.next();//手動移動
while (iterator.hasNext()){
Object obj= iterator.next();
System.out.println(obj);
}
}
}
Iterator接口的子接口(ListIterator)
ListIterator特有的方法 | 概述 |
---|---|
boolean hasPrevious(): | 是否存在前一個元素 |
E previous(): | 返回列表中的前一個元素 |
注意:以上兩個方法可以實現反向遍歷 但是注意 要完成反向遍歷之前 要先進行正向遍歷 這樣指針才能移到最後,如果直接反向遍歷是沒有效果的 因爲指針默認位置就在最前面 他前面沒有元素。
併發修改異常(ConcurrentModificationException)出現的原因
原因是:我們的迭代依賴與集合 當我們往集合中添加好了元素之後 獲取迭代器 , 那麼迭代器已經知道了集合的元素個數;
這個時候你在遍歷的時候又突然想給 集合裏面加一個元素(用的是集合的add方法),就會出現併發修改異常。
如何更改:
- 採用迭代器自帶的add方法添加元素(ListIterator.add());
- 使用for循環遍歷元素。
3.Collection的子接口List
List集合特有的功能
方法 | 概述 |
---|---|
void add(int index,E element) | 在指定索引處添加元素 |
E remove(int index) | 移除指定索引處的元素 |
E get(int index) | 獲取指定索引處的元素 |
E set(int index,E element) | 更改指定索引處的元素 |
4.List的三個子類
(1)三個子類(ArrayList,Vector,LinkedList)之間的區別:
- ArrayList:
底層數據結構是數組,查詢快,增刪慢。
線程不安全,效率高。 - Vector:
底層數據結構是數組,查詢快,增刪慢。
線程安全,效率低。 - LinkedList:
底層數據結構是鏈表,查詢慢,增刪快。
線程不安全,效率高。
(2)ArrayList特有的方法功能
void forEach(Consumer<? super E> action) | 執行特定動作的每一個元素的 Iterable直到所有元素都被處理或操作拋出異常 |
(3)Vector特有的方法功能
public void addElement(E obj) | 將指定的數據類型添加到此向量的末尾,使其大小增加1. |
public E elementAt(int index) | 在指定的索引處加入指定的數據類型 |
public void setElementAt(E obj, int index) | 將指定索引處的組件設置爲指定的對象 |
public boolean removeElement(Object obj) | 移除索引最小的匹配項 |
(4)LinkedList特有的方法功能
public void addFirst(E e) | 將指定的元素插入集合的開頭 |
---|---|
public void addLast(E e) | 將指定的元素插入集合的末尾 |
public E getFirst() | 返回此集合的第一個元素 |
public E getLast() | 返回此集合的最後一個元素 |
public E removeFirst() | 移除此集合的第一個元素 |
public E removeLast() | 移除此元素的最後一個元素 |
5.泛型
採用泛型的目的:解決需要轉型的問題。
(1)泛型類
public class 類名<泛型類型1,…>
注意:泛型類型必須是引用類型
(2)泛型方法
public <泛型類型> 返回類型 方法名(泛型類型 變量名)
(3)泛型接口
public interface 接口名<泛型類型>
(4)泛型通配符
- 通配符<?> 任意類型,如果沒有明確,那麼就是Object以及任意的Java類了
- ? extends E (向下限定,E及其子類)
- ? super E (向上限定,E及其父類)
public class MyTest2 {
public static void main(String[] args) {
ArrayList<Dog> objects = new ArrayList<Dog>();
//?泛型統配符
ArrayList<?> objects2 = new ArrayList<Cat>();
//向上限定
ArrayList<? super Animal> objects3 = new ArrayList<Animal>();
ArrayList<? super Animal> objects4 = new ArrayList<Object>();
//向下限定
ArrayList<? extends Animal> objects5 = new ArrayList<Dog>();
ArrayList<? extends Animal> objects6= new ArrayList<Cat>();
ArrayList<? extends Animal> objects7 = new ArrayList<Animal>();
}
}
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{}