1、集合體系概述
為什麼有多種容器:因為存放資料的資料結構不同。
2、Collection集合
方法
第一、add方法的參數類型是Object,以便接受任意類型的對象。
第二、集合中儲存的都是對象的引用(地址)。
第三、什麼就是迭代器?就是集合取出元素的方式。
迭代器原理:
集合把取出方式定義在集合的內部,這樣取出方式就可以直接存取集合內部的元素,那麼取出方式就被定義成了內部類。
而每一個容器的資料結構不同,所以取出的動作細節也不一樣,但是取出動作都有判斷和取出的共同點,那麼這樣就可以抽取出共同點Iterator。
擷取集合的取出對象方法,就是通過集合對外提供一個方法iterator();。
import java.util.*;
public class CollectionDemo{
public static void main(String[] args){
method_get();
}
public static void method_get(){
ArrayList a = new ArrayList();
a.add("java1");
a.add("java2");
a.add("java3");
a.add("java4");
//迭代器第一種方法,迭代器對象用完後不銷毀記憶體不好,但常用。
Iterator it = a.iterator();
while(it.hasNext()){//擷取迭代器,用於取出集合中的元素
sop(it.next());
}
//迭代器第二種方法,迭代器對象是局部變數,用完後會釋放記憶體。
for(Iterator it2 = a.iterator();it2.hasNext();){
sop(it2.next());
}
}
public static void method_retain(){
ArrayList a = new ArrayList();
a.add("java1");
a.add("java2");
a.add("java3");
a.add("java4");
ArrayList b = new ArrayList();
b.add("java1");
b.add("java2");
b.add("java5");
//4、取交集,取出相同的
//a.retainAll(b);
//5、刪除相同的
a.removeAll(b);
sop(a);
sop(b);
}
public static void method_base(){
ArrayList a = new ArrayList();
//1、添加元素
a.add("java1");
a.add("java2");
sop("size:"+a.size());
sop("原集合:"+a);
//2、刪除元素
//a.remove("java1");
//清空集合
//a.clear();
//3、判斷元素
sop("java1是否存在:"+a.contains("java1"));
sop("集合是否為空白?"+a.isEmpty());
sop(a);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
3、List特有方法:凡是可以操作角標的方法都是該體系特有的方法。
增:
add(index,element);
addAll(index,Collection);
刪:
remove(index);
改:
set(index,element);
查:
get(index);
subList(from,to);
listIterator();
List特有的迭代器,ListIterator是Iterator的子介面。
4、為什麼在List中用ListIterator迭代器代替Collection中的Iterator迭代器?
第一、Iterator迭代器只有3個方法:hasNext()、next()、remove()方法。沒有增加、修改等方法。當以後程式中需要用到增加元素、修改元素功能時,使用Collection集合中的add()、set()就會出現用集合和迭代器在同時操作對象的情況,這時就會出現ConcurrentModificationException異常。
第二、ListIterator列表迭代器中添加了add()、set()等功能,這樣當使用列表迭代器時,就可以保證不需要集合方法就可以完成所有需要的功能,避免集合和迭代器同時操作一個對象元素的情況。
5、Vector集合中的枚舉
Enumeration en = v.elements();====>Iterator it = a.Iterator();
枚舉就是Vector特有的取出方式。
6、LikedList集合
LinkedList特有方法:
addFirst();
addLast();
removeFirst();
removeLast();
7、ArrayList集合:數組結構
開發中List看需求選擇LinkedList、ArrayList;不過一般用ArrayList,因為開發中查詢多,增刪少。
8、TreeSet集合原理二叉樹
9、List、Set集合
Collection
|---List:元素是有序的(存入和取出的順序一致),元素可以重複,因為該集合體系有索引。
|---ArrayList:底層的資料結構使用的是數組結構。特點:查詢速度快,但是增刪慢。線程不同步。可變長度數組:數組初始化預設長度為10,當長度超過時,50%延長,節約空間。
|---LinkedList:底層的資料結構使用的是鏈表。特點:增刪速度快,查詢慢。
|---Vector:底層的資料結構使用的是數組結構。線程同步。被ArrayList替代了。可變長度數組:數組初始化預設長度為10,當長度超過時,100%延長。
|---Set:元素是無序的(存入和取出的順序不一定一致),元素不可以重複。Set的功能和Collection的功能是一樣的。
|---HashSet:底層資料結構是雜湊表。線程是非同步的。HashSet是如何保證元素唯一性呢?是通過元素的兩個方法,hashCode()和equals()來完成。如果元素的hashCode值相同,才會判斷equals是否為true。如果元素的hashCode值不同,不會調用equals。ArrayList判斷元素是否相同只依賴於equals,Set判斷元素是否相同依賴於hashCode和equals。寫集合時要覆寫hashCode\equals方法。
|---TreeSet:可以對Set集合中的元素進行排序。排序時,當主要條件相同時,一定要判斷一下次要條件。底層資料結構是二叉樹。保證資料元素唯一性的依據:compareTo方法return0,return
-1在二叉樹左邊,return 1在二叉樹右邊。
TreeSet第一種排序方式:讓元素自身具備比較性,元素需要實現Comparable介面,覆蓋compareTo方法。這種方式也稱為元素的自然順序或者叫預設順序。
TreeSet第二種排序方式:當元素自身不具備比較性時,或者具備的比較性不是需要的。這時就讓集合自身具備比較性。在集合初始化時就有了比較方法。定義了比較子,將比較子作為參數傳給TreeSet的建構函式。
當兩種排序都存在時,以第二種方式比較子為準。具體步驟是定義一個類,實現Comparator介面,覆蓋compare方法。