一、集合基本特性
1 概述
2 數組與集合區別
3 使用場景
二 、Java集合框架架構圖
三、Iterator
1 迭代器原理
2 常用方法
3 應用場景
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
/*Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee"); //這裏會拋出ConcurrentModificationException併發修改異常
}
}*/
ListIterator lit = list.listIterator();
//如果想在遍歷的過程中添加元素,可以用ListIterator中的add方法
while(lit.hasNext()) {
String str = (String)lit.next();
if(str.equals("world")) {
lit.add("javaee");
}
}
Enumeration的速度是Iterator的兩倍,也使用更少的內存。Enumeration是非常基礎的,也滿足了基礎的需要。但是,與Enumeration相比,Iterator更加安全,因爲當一個集合正在被遍歷的時候,它會阻止其它線程去修改集合。 迭代器取代了Java集合框架中的Enumeration。迭代器允許調用者從集合中移除元素,而Enumeration不能做到。爲了使它的功能更加清晰,迭代器方法名已經經過改善。
4 ListIterator
5 ListIterator與Iterator的區別?
四、List集合
1 List集合特點
ArrayList: 底層數據結構是數組,查詢快,增刪慢。線程不安全,效率高。
Vector:底層數據結構是數組,查詢快,增刪慢。 線程安全,效率低。
Vector相對ArrayList查詢慢(線程安全的)
Vector相對LinkedList增刪慢(數組結構)
LinkedList: 底層數據結構是鏈表,查詢慢,增刪快。 線程不安全,效率高。
Vector和ArrayList的區別:
(1)Vector是線程安全的,效率低;ArrayList是線程不安全的,效率高。
(2)共同點:都是數組實現的
ArrayList和LinkedList的區別
(1)ArrayList底層是數組結構,查詢和修改快
(2) LinkedList底層是鏈表結構的,增和刪比較快,查詢和修改比較慢
共同點:都是線程不安全的
使用說明:查詢多用ArrayList;增刪多用LinkedList;如果都多ArrayList
2 Vector集合特點
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
Vector v = new Vector(); //創建集合對象,List的子類
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
- //Vector迭代
Enumeration en = v.elements(); //獲取枚舉
while(en.hasMoreElements()) { //判斷集合中是否有元素
System.out.println(en.nextElement());//獲取集合中的元素
}
五、Set集合(接口)
1 概述
(1)set集合特點無序,不允許重複。常用的實現類有HashSet ,TreeSet。特點見下圖
(2)資料參考:http://blog.csdn.net/zhangweiiou/article/details/48946623
2 HashSet
(1)HashSet繼承了AbstractSet實現了Set接口,在底層使用HashMap的key進行元素存儲,從而保證了元素的唯一性。
(2)我們使用Set集合都是需要去掉重複元素的, 如果在存儲的時候逐個equals()比較, 效率較低,哈希算法提高了去重複的效率, 降低了使用equals()方法的次數
(3)當HashSet調用add()方法存儲對象的時候, 先調用對象的hashCode()方法得到一個哈希值, 然後在集合中查找是否有哈希值相同的對象,如果沒有哈希值相同的對象就直接存入集合,如果有哈希值相同的對象, 就和哈希值相同的對象逐個進行equals()比較,比較結果爲false就存入, true則不存
將自定義類的對象存入HashSet去重複
類中必須重寫hashCode()和equals()方法
hashCode(): 屬性相同的對象返回值必須相同, 屬性不同的返回值儘量不同(提高效率)
equals(): 屬性相同返回true, 屬性不同返回false,返回false的時候存儲
3 TreeSet
a.自然順序(Comparable)
TreeSet類的add()方法中會把存入的對象提升爲Comparable類型
調用對象的compareTo()方法和集合中的對象比較
根據compareTo()方法返回的結果進行存儲
b.比較器順序(Comparator)
創建TreeSet的時候可以指定 一個Comparator
如果傳入了Comparator的子類對象, 那麼TreeSet就會按照比較器中的順序排序
add()方法內部會自動調用Comparator接口中compare()方法排序
調用的對象是compare方法的第一個參數,集合中的對象是compare方法的第二個參數
c.兩種方式的區別
TreeSet構造函數什麼都不傳, 默認按照類中Comparable的順序(沒有就報錯ClassCastException)
TreeSet如果傳入Comparator, 就優先按照Comparator
Java集合框架中的工具類
1 概述:集合框架中的工具類有Arrays和Collections兩種。
2 Arrays: 此類包含了用來操作數組的各種方法如:搜索,排序。
應用場景之 - 數據與集合的轉換
String [] strArr = list.toArray(new String[list.size()]);
Integer[]arr = {11,22,33,44,55};
List<Integer> list = Arrays.asList(arr);
集合迭代的三種方式總結
for(type element: array)
{
System.out.println(element);
}