黑馬程式設計師----JAVA基礎集合框架_迭代器
------ android培訓、java培訓、期待與您交流! ----------
個人認為總的來說,map不是地圖是對映的意思,所以裡面是鍵值成對存在的,list的清單的意思,所以裡面是一項一項列出來的,set是集合的意思,所以裡面不能有重複的(數學裡面的集合裡面不能有重複元素).
Java的集合類主要由兩個介面派生而出:Collection和Map,Collection和Map是Java集合框架的根介面,這兩個介面又包含了一些介面或實現類。collection下面兩個介面list和set都是繼承了collection,要注意的是這裡三個概念都是介面,而arraylist等才是他們的實現類。下面一個圖摘抄自ibm的教程,可以看出集合介面的繼承關係
Collection
如果只是存一個值,用Collection
List :元素有序(存入和取出的順序一致),可重複
ArrayList :用的比較多 底層資料結構是陣列。查詢快,增刪慢。執行緒不安全。
LinkedList :可以方便操作頭尾元素,底層資料結構是連結串列。查詢慢,增刪快。執行緒不安全。
Vector :底層資料結構也是陣列實現,但是每次遞增100%.執行緒安全,插入時效率比較高.Set 元素無序,不可重複。
HashSet:底層資料結構是雜湊表結構。無順序,不可重複,可以保證元素的唯一性。 它如何保證的呢?先hashCode,在equals。
LinkedHashSet : 底層資料結構是連結串列和雜湊結構。元素有序,不可重複,可以讓新增時的順序與取出時的順序一致。
TreeSet
:底層資料結構是二叉數。保證存入的元素是有序的不會重複,TreeSet有順序,效率比較低
。
有序是通過兩種方式體現的。
一種是讓集合具備比較性。
一種是讓元素本身具備比較性。
為演示具體 Set 類的使用,下面的程式建立了一個 HashSet,並往裡添加了一組名字,其中有個名字添加了兩次。接著,程式把集中名字的列表打印出來,演示了重複的名字沒有出現。接著,程式把集作為 TreeSet 來處理,並顯示有序的列表。
import java.util.*;public class SetExample { public static void main(String args[]) { Set set = new HashSet(); set.add("Bernadine"); set.add("Elizabeth"); set.add("Gene"); set.add("Elizabeth"); set.add("Clara"); System.out.println(set); Set sortedSet = new TreeSet(set); System.out.println(sortedSet); } }
Map
如果儲存的是關係,key-value用Map
HashMap :底層資料結構是雜湊表。用的比較多。 執行緒不安全。
LinkedHashMap :可以讓新增時的順序與取出時的順序一致
Hashtable :hash實現 不可以有null鍵和null值 執行緒安全
Properties :這個可以和IO進行結合使用。
TreeMap :底層資料結構是二叉數。 用key來進行排序
1. Collection是什麼?
Collection介面是List、Set介面的父介面,其含有集合都具備的抽象方法.同時可以操作這兩個介面。
2. Collection有什麼用?
其實現類叫集合,為一個容器,裡面可以裝不同的物件,並對其進行增刪改查的操作
3. Collection怎麼用?
其本身這些方法是不能用的,但是其實現類實現了就都可以用了,這個叫共有方法
增:增加一個物件或集合,增加成功返回true
1.public boolean add(Object obj) 向集合中新增一個元素obj
2.public boolean addAll(Collection c) 向集合中新增一堆元素 c
刪 改:: 刪除某個元素,或刪除所有元素,或將一部分元素刪除.
public void clear() 清空集合
.public boolean remove(Object obj)
將集合中元素obj刪除,如果刪除成功,返回true.一次只能刪除一個.
public boolean removeAll(Collect c) 將集合中與c集合中相同的元素刪除.
查:查詢長度,交集,元素是否相同,是否是子集,是否是空集合.
public boolean retainAll(Collection c) 求集合的交集,
public int size(); 得到集合中元素的個數
public boolean contains(Object obj)
判斷集合中是否有與obj相同的元素.這裡面的相同是equals
public boolean containsAll(Collection c)
判斷集合c是否是當前集合的子集.
public boolean isEmpty()
判斷集合中是否有元素.如<A HREF="Demo1.java"></A>果size為0,代表空,返回true。
Object[] toArray()返回包含此 collection 中所有元素的陣列。
4. Collection什麼時候用?
當需要對多個物件進行操作時,就要用到集合
5. Collection有什麼特點?
集合只能放物件
集合分為兩種,一種有序可重複,一中無序不可重複.
Collection介面定義操作集合元素的具體方法大家可以參考API文件,這裡通過一個例子來說明Collection的新增元素、刪除元素、返回集合中元素的個數以及清空集合元素的方法。
public class TestCollection
{
public static void main(String[] args)
{
Collection c = new ArrayList();
//新增元素
c.add("元素一");
//雖然集合裡不能放基本型別的值,但Java支援自動裝箱
c.add(6);
System.out.println("c集合的元素個數為:" + c.size());
//刪除指定元素
c.remove(6);
System.out.println("c集合的元素個數為:" + c.size());
//判斷是否包含指定字串
System.out.println("c集合的是否包含元素一字串:" + c.contains("元素一"));
c.add("輕量級J2EE企業應用實戰");
System.out.println("c集合的元素:" + c);
Collection books = new HashSet();
books.add("輕量級J2EE企業應用實戰");
books.add("Struts2權威指南");
System.out.println("c集合是否完全包含books集合?" + c.containsAll(books));
//用c集合減去books集合裡的元素
c.removeAll(books);
System.out.println("c集合的元素:" + c);
//刪除c集合裡所有元素
c.clear();
System.out.println("c集合的元素:" + c);
//books集合裡只剩下c集合裡也同時包含的元素
books.retainAll(c);
System.out.println("books集合的元素:" + books);
}
}
二、Iterator迭代器---重點
1. 迭代器是什麼?
迭代器(iterator)是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的地址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來。
2. 迭代器有什麼用?
迭代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++“操作array元素”時的指標介面一致。不同之處在於,迭代器是個所謂的智慧指標,具有遍歷複雜資料結構的能力。其下層執行機制取決於其所遍歷的資料結構。因此,每一種容器型別都必須提供自己的迭代器。事實上每一種容器都將其迭代器以巢狀的方式定義於內部。因此各種迭代器的介面相同,型號卻不同。這直接匯出了泛型程式設計的概念:所有操作行為都使用相同介面,雖然它們的型別不同。
3. 迭代器怎麼用?
Iterator 迭代器名 = 集合名.iterator();-----得到一本集合的迭代器物件,
然後用這個物件呼叫Iterator介面中定義的方法,Iterator有三個方法,
迭代器名.hasNext().....迭代器名.next().....迭代器名.remove().....
來實現:
1.public boolean hasNext() 判斷是否有元素進行迭代,沒有返回false,一般用於定義條件標記
2.public Object next(); 取到下一個元素
3.public void remove(); 刪除元素
方法可由底層集合有選擇的支援。當底層集合呼叫並支援該方法時,最近一次 next() 呼叫返回的元素就被除去。為演示這一點,用於常規 Collection 的 Iterator
介面程式碼如下:
Collection collection = …;
Iterator iterator = collection.iterator();
while (iterator.hasNext())
{
Object element = iterator.next();
if
(removalCheck(element))
{
iterator.remove();
}
}
4. 迭代器什麼時候用?
當需要對集合裡的元素進行遍歷或移除操作時
5. 迭代器有什麼特點?
public Iterator iterator() 得到集合的迭代器.
迭代器模式。Iterator對已集合類中的任何一個實現類,都可以返回這樣一個Iterator物件。
就和迴圈一樣,好處是可以適用於任何一個類,而且實際上java對它進行了優化,
比直接用index訪問快一點(這一點沒法考證,別人都這樣說)。
不過呢,有一點很好,就是用起來確實很好用,加上泛型就更好用啦。
比如說這樣一個例子ArrayList< String > arr = new ArrayList< String >();
Iterator it = arr.iterator();迭代的時候可以這樣while( it .hasNext() ){ //做一些處理,比如 System.out.print( it.next );}配合上泛型,
一個好處是it.next()可以不用型別轉換。以前用的時候是Object,還要自己轉,我感覺,Iterator和泛型簡直就是絕配哈。