List集合的子類
一、ArrayList集合(實現類)
1、特點
1、底層數據結構是:數組(元素增刪慢,查找快);
2、此實現不是同步的(多線程)、線程不安全;
3、ArrayList使用無參構造函數創建對象時,Object數組默認的容量時10,當長度不夠時,會增長0.5倍;
2、創建對象格式
ArrayList<?> arrayList = new ArrayList<>();或者
Collection<?> c = new ArrayList<>();//多態
3、ArrayList為什么是長度不可變的?
ArrayList 底層是通過數組實現的,數組在創建的時候必須要指定其大小,那么基於數組實現無法直接達到長度可變。
4、ArrayList 是如何達到長度可變的?
ArrayList 通過創建一個大於現有數組長度的數組,並將原數組數據按順序拷貝到新數組變相完成長度可變的。
5、遍歷操作
toArray():數組遍歷
iterator():迭代器遍歷
foreach():增強for循環,底層是迭代器
listIterator():列表迭代
listIterator(index):從指定位置列表迭代
for() size()和get()
6、去重復操作
1、新建一個新的集合
遍歷老的集合,
如果新的集合里面包含有這個老的集合元素,
就把老集合的元素添加到新的集合
2、冒泡排序、快速排序等數據結構方法去重
例題
public static void main(String[] args) {
//創建集合對象
List li = new ArrayList();
//創建員工對象
Employee emp0 = new Employee(2021, "張三", 18, 9000);
Employee emp1 = new Employee(2022, "李四", 18, 9000);
Employee emp2 = new Employee(2022, "李四", 18, 9000);
Employee emp3 = new Employee(2022, "王五", 18, 9000);
Employee emp4 = new Employee(2022, "李四", 21, 9000);
//把Employee對象添加到list集合
li.add(emp0);
li.add(emp1);
li.add(emp2);
li.add(emp3);
li.add(emp4);
//2.要求員工不能夠存儲重復元素 [2種方法]
// //第一種
// //先創建新集合
// List newList = new ArrayList();
// //遍歷老集合
// for (Object obj : li) {
// if (!newList.contains(obj)) {//如果新集合里面不包括老集合的元素,則添加
// newList.add(obj);
// }
// }
////把新集合賦值給老集合
// li = newList;
////遍歷輸出
// for (Object obj : li) {
// System.out.println(obj);
// }
System.out.println("--------------------");
//第二種:選擇排序算法:第一個元素依次和后面的元素進行比較
for (int i = 0; i < li.size(); i++) {
for (int j = i+1; j <li.size() ; j++) {
if(li.get(i).equals(li.get(j))){
li.remove(j);
j--;
}
}
}
for (Object obj:li) {
System.out.println(obj);
}
//4.要求使用至少四種方式遍歷員工對象
System.out.println("----------1------------");
//第一種
//Collection toArray
Object[] objs = li.toArray();
for (Object obj: objs) {
System.out.println(obj);
}
System.out.println("----------2-------------------");
//第二種 迭代器
Iterator iterator = li.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("------------3----------------");
//foreach
for (Object obj: li) {
System.out.println(obj);
}
System.out.println("---------------4----------------");
//for循環
for (Iterator it = li.iterator();it.hasNext(); System.out.println(it.next()) );
System.out.println("------------5--------------");
//list遍歷:列表迭代器
ListIterator listIterator = li.listIterator();
//先正向遍歷后才能逆向遍歷
while (listIterator.hasNext()){
System.out.println(listIterator.next());
}
System.out.println("----------------6--------------");
while (listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
7、常用方法
//添加
// boolean add(E e) 將指定的元素添加到此列表的尾部。
// void add(int index, E element) 將指定的元素插入此列表中的指定位置。
//boolean addAll(Collection<? extends E> c) 按照指定集合的迭代器所返回的元素順序,將該集合中的所有元素添加到此列表的尾部。
//boolean addAll(int index, Collection<? extends E> c)從指定的位置開始,將指定集合中的所有元素插入到此列表中。
//移除
//void clear() 移除此列表中的所有元素。
//E remove(int index) 移除此列表中指定位置上的元素。
//boolean remove(Object o) 移除此列表中首次出現的指定元素(如果存在)。
//protected void removeRange(int fromIndex, int toIndex) 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。
//判斷
//boolean contains(Object o) 如果此列表中包含指定的元素,則返回 true。
//boolean isEmpty() 如果此列表中沒有元素,則返回 true
//獲取
// E get(int index) 返回此列表中指定位置上的元素。
//int indexOf(Object o) 返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。
// int size() 返回此列表的長度
//替換
//E set(int index, E element) 用指定的元素替代此列表中指定位置上的元素。
//數組
//Object[] toArray() 按適當順序(從第一個到最后一個元素)返回包含此列表中所有元素的數組。
二、LinkedList集合(實現類)
特點:
1、底層數據結構是:鏈表
2、具有堆棧、隊列或雙端隊列的操作。
3、有list集合特點和雙端隊列的特點
4、插入和刪除效率高,查詢和修改效率低
5、線程不安全
6、存儲有序
7、可以存儲null值
8、元素允許重復
9、可以通過索引操作節點
注意:使用LinkedList集合特有的方法,不能使用多態
創建對象格式
LinkedList<?> linkedList = new LinkedList<>();
特有方法
List集合的方法都有,下面介紹一下LinkedList的特有方法
//添加
//void addFirst(E e) 將指定元素插入此列表的開頭。
// void addLast(E e) 將指定元素添加到此列表的結尾。
//boolean offerFirst(E e) 在此列表的開頭插入指定的元素。
//boolean offerLast(E e) 在此列表末尾插入指定的元素。
//void push(E e) 將元素推入此列表所表示的堆棧。
//移除
//E removeFirst() 移除並返回此列表的第一個元素。
//E removeLast() 移除並返回此列表的最后一個元素。相當於remove()
//E pollFirst() 獲取並移除此列表的第一個元素;如果此列表為空,則返回 null。
//E pollLast() 獲取並移除此列表的最后一個元素;如果此列表為空,則返回 null。
//E pop() 從此列表所表示的堆棧處彈出第一個元素。相當於removeFirst()
// 獲取
// E getFirst() 返回此列表的第一個元素。
//E getLast() 返回此列表的最后一個元素。
//E peekFirst() 獲取但不移除此列表的第一個元素;如果此列表為空,則返回 null。
//E peekLast() 獲取但不移除此列表的最后一個元素;如果此列表為空,則返回 null。
三、Vector集合(實現類)
特點
1、底層數據結構是:數組(有索引、查詢快、增刪慢)
2、線程安全(單線程)
特有方法
// Enumeration<E> elements() 返回此向量的組件的枚舉。相當於迭代器iterator().hasNext()
//E elementAt(int index) 返回指定索引處的組件。 相當於迭代器iterator().Next()