1. 程式人生 > >Java中的集合Collection以及對應的子類list類

Java中的集合Collection以及對應的子類list類

1:物件陣列(掌握)
(1)陣列既可以儲存基本資料型別,也可以儲存引用型別。它儲存引用型別的時候的陣列就叫物件陣列。


2:集合(Collection)(掌握)
(1)集合的由來?
我們學習的是Java -- 面向物件 -- 操作很多物件 -- 儲存 -- 容器(陣列和StringBuffer) -- 陣列
而陣列的長度固定,所以不適合做變化的需求,Java就提供了集合供我們使用。
(2)集合和陣列的區別?
A:長度區別
陣列固定
集合可變
B:內容區別
陣列可以是基本型別,也可以是引用型別
集合只能是引用型別
C:元素內容
陣列只能儲存同一種類型
集合可以儲存不同型別(其實集合一般儲存的也是同一種類型)
(3)集合的繼承體系結構?
由於需求不同,Java就提供了不同的集合類。這多個集合類的資料結構不同,但是它們都是要提供儲存和遍歷功能的,
我們把它們的共性不斷的向上提取,最終就形成了集合的繼承體系結構圖。

Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
(4)Collection的功能概述(自己補齊)
A:新增功能:boolean add(E e)確保此 collection 包含指定的元素(可選操作)。
B:刪除功能:boolean remove(Object o)從此 collection 中移除指定元素的單個例項,如果存在的話(可選操作)。
C:判斷功能:
boolean isEmpty()如果此 collection 不包含元素,則返回 true。 
boolean contains(Object o)如果此 collection 包含指定的元素,則返回 true
D:獲取功能:Iterator<E> iterator()返回在此 collection 的元素上進行迭代的迭代器。
E:長度功能:int size()返回此 collection 中的元素數。
F:交集(瞭解):boolean retainAll(Collection<?> c)僅保留此 collection 中那些也包含在指定 collection 的元素(可選操作)。
G:把集合轉陣列(瞭解):Object[] toArray()返回包含此 collection 中所有元素的陣列。
(5)Collection集合的遍歷
A:把集合轉陣列(瞭解)
B:迭代器(集合專用方式)
(6)迭代器
A:是集合的獲取元素的方式。
B:是依賴於集合而存在的。
C:迭代器的原理和原始碼。
a:為什麼定義為了一個介面而不是實現類?
b:看了看迭代器的內部類實現。
(7)Collection集合的案例(遍歷方式 迭代器)
集合的操作步驟:
A:建立集合物件
B:建立元素物件
C:把元素新增到集合
D:遍歷集合

A:儲存字串並遍歷
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;

public class CollectionDemo {
public static void main(String[] args) {
//建立集合物件
Collection c = new ArrayList();

//建立並新增元素
c.add("hello");
c.add("world");
c.add("java");

//遍歷集合
Iterator it = c.iterator();
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}
}
}

B:儲存自定義物件並遍歷
public class Student {
private String name;
private int age;

public Student(){}

public Student(String name,int age) {
this.name = name;
this.age = age;
}

//getXxx()/setXxx()
}

import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;

public class StudentDemo {
public static void main(String[] args) {
//建立集合物件
Collection c = new ArrayList();

//建立學生物件
Student s1 = new Student("林青霞",27);
Student s2 = new Student("風清揚",30);
Student s3 = new Student("劉意",30);
Student s4 = new Student("武鑫",25);
Student s5 = new Student("劉曉曲",16);

//新增元素
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);

//遍歷集合
Iterator it = c.iterator();
while(it.hasNext()) {
Student s = (Student)it.next();
System.out.println(s.getName()+"---"+s.getAge());
}
}
}


3:集合(List)(掌握)
(1)List是Collection的子介面
特點:有序(儲存順序和取出順序一致),可重複。
(2)List的特有功能:(自己補齊)
A:新增功能:void add(int index,E element)在列表的指定位置插入指定元素(可選操作)。
B:刪除功能:E remove(int index)移除列表中指定位置的元素(可選操作)。
C:獲取功能:E get(int index)返回列表中指定位置的元素。
D:迭代器功能:ListIterator<E> listIterator()返回此列表元素的列表迭代器(按適當順序)。 (list集合特有的迭代器,雙向迭代器,普通的迭代器iterator是單向的。並且必須先正向遍歷後,才能反向遍歷)
E:修改功能:E set(int index,E element)用指定元素替換列表中指定位置的元素(可選操作)。 
(3)List集合的特有遍歷功能
A:由size()和get()結合。
B:程式碼演示
//建立集合物件
List list = new ArrayList();

//建立並新增元素
list.add("hello");
list.add("world");
list.add("java");

//遍歷集合
Iterator it = list.iterator();
while(it.hasNext()) {
String s =(String) it.next();
System.out.println(s);
}
System.out.println("----------");

for(int x=0; x<list.size(); x++) {
String s =(String) list.get(x);
System.out.println(s);
}
(4)列表迭代器的特有功能;(瞭解)
可以逆向遍歷,但是要先正向遍歷,所以無意義,基本不使用。
(5)併發修改異常(所以在用迭代器遍歷集合時,不能通過集合物件來修改集合)

A:出現的現象
迭代器遍歷集合,集合修改集合元素
B:原因
迭代器是依賴於集合的,而集合的改變迭代器並不知道。
C:解決方案
a:迭代器遍歷,迭代器修改(ListIterator),就是用迭代器來修改集合元素。
元素新增在剛才迭代的位置
b:集合遍歷,集合修改(size()和get())
元素新增在集合的末尾
(6)常見資料結構
A:棧 先進後出
B:佇列 先進先出
C:陣列 查詢快,增刪慢
D:連結串列 查詢慢,增刪快
(7)List的子類特點(面試題)
ArrayList
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
LinkedList
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。

到底使用誰呢?看需求?
分析:
要安全嗎?
要:Vector(即使要,也不使用這個,後面再說)
不要:ArrayList或者LinkedList
查詢多;ArrayList
增刪多:LinkedList

什麼都不知道,就用ArrayList。
(8)List集合的案例(遍歷方式 迭代器和普通for)
A:儲存字串並遍歷

B:儲存自定義物件並遍歷

1:List的子類(掌握)
(1)List的子類特點
ArrayList:
底層資料結構是陣列,查詢快,增刪慢
執行緒不安全,效率高
Vector:
底層資料結構是陣列,查詢快,增刪慢
執行緒安全,效率低
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快
執行緒不安全,效率高
(2)ArrayList
A:沒有特有功能需要學習
B:案例
a:ArrayList儲存字串並遍歷
b:ArrayList儲存自定義物件並遍歷
(3)Vector
A:有特有功能
a:新增
public void addElement(E obj)--add()
b:獲取
public E elementAt(int index)--get()
public Enumeration<E> elements()--  iterator()
B:案例
a:Vector儲存字串並遍歷
b:Vector儲存自定義物件並遍歷
(4)LinkedList
A:有特有功能
a:新增
addFirst() //在開頭新增
addLast()  //在結尾新增
b:刪除
removeFirst()  //刪除第一個
removeLast()   //刪除最後一個
c:獲取
getFirst()   //獲取第一個元素
getLast()    //獲取最後一個元素
B:案例
a:LinkedList儲存字串並遍歷
b:LinkedList儲存自定義物件並遍歷
(5)案例:
A:去除集合中的多個字串的重複元素(如果字串的內容相同,即為重複元素)
思路1:重新建立一個集合,遍歷原集合的每一個元素,判斷新集合中是否有該元素(contains),若有,則不新增,若沒有,則新增到新集合中。(該思路需要建立一個新的集


合)
思路2:由選擇排序的思想,從第一個元素開始,與後面的元素比較,若發現後面有重複,就刪除後面的元素即可。(該思路在原來的集合上進行,但是要注意刪除之後,後面的


元素往前移動了一位,因此,需要將比較的元素也往前移動一位。)
B:去除集合中的多個自定義物件的重複元素(如果自定義物件的成員變數值都相同,即為重複元素)
思路:實現方法跟上面的方法一樣,只不過需要注意的是兩個元素之間比較的時候,是呼叫equals方法,因此自定義型別必須要重寫equals方法(自動生成即可)。
C:用LinkedList模擬一個棧資料結構的集合類,並測試。(你要定義一個集合類,只不過內部可以使用LinkedList來實現。)
首先需要明白棧的特點,然後要明白Linkedlist的特有功能。