以前看過一些關於Java集合類的內容,可是過段時間不用有些就忘記了,如今整理下之後看也方便,只是給本身當筆記看的~~~~html
(轉載了一些註明:http://www.cnblogs.com/leeplogs/p/5891861.html)java
通常地,咱們經常使用的集合類有這幾種:數組
List結構的集合類:ArrayList類,LinkedList類,Vector類,Stack類框架
Map結構的集合類:HashMap類,Hashtable類dom
Set結構的集合類:HashSet類,TreeSet類spa
Queue結構的集合:Queue接口3d
首先呢,咱們來看看爲何要用集合類,這就要說說集合類與數組的關係了。數組(能夠存儲基本數據類型)是用來存現對象的一種容器,可是數組的長度固定,不適合在對象數量未知的狀況下使用。code
集合(只能存儲對象,對象類型能夠不同)的長度可變,可在多數狀況下使用。 集合的底層,是如何實現可變長度的,這裏咱們後面再來分析,。。。htm
一.Java集合框架圖可見下圖(實線邊框的是實現類,折線邊框的是抽象類,而點線邊框的是接口)對象
在Java類庫中,集合類的基本接口是Collection接口。這個接口有兩個基本方法:
public interface Collection<E> { boolean add(E element); Iterator<E> iterator();
... }
add()方法就是添加元素了,而Iterator方法用於返回一個實現了Iterator接口的對象。 咱們能夠使用這個迭代器的對象一次訪問集合中的元素。
而Iterator接口包含4個方法:
public interface Iterator<E> { E next(); boolean hasNext(); void remove(); default void forEachRemaning(Consumer<? super E> action); }
經過反覆調用next方法,能夠逐個訪問集合中的每一個元素。 若是到了集合末尾,next方法將會拋出一個NoSuchElementException.因此在調用next以前須要先調用一下hasNext()方法。
例如:
Collection<String> c = ...; Iterator<String> itra = c.iterator(); while(itra.hasNext()) { String element = itra.next(); do something with element... }
或者用foreach:
for(element:c) { do something with element; }
二. 集合有兩個基本接口: Collection 和 Map
Collection接口是集合類的根接口,Java中沒有提供這個接口的直接的實現類。可是卻讓其被繼承產生了兩個接口,就是Set和List。Set中不能包含重複的元素。List是一個有序的集合,能夠包含重複的元素,提供了按索引訪問的方式。
Map是Java.util包中的另外一個接口,它和Collection接口沒有關係,是相互獨立的,可是都屬於集合類的一部分。Map包含了key-value對。Map不能包含重複的key,可是能夠包含相同的value。
三.幾個具體的接口和實現類
1. List(有序,可重複)
相似於順序表,元素會增長到容器中的特定位置,能夠採用兩種方式訪問元素:1.迭代器 2.使用一個整數索引來訪問。 後一種方式稱爲隨機訪問(random access),由於這樣能夠按任意順序訪問元素。List 查詢數據快,可是插入,刪除數據時速度很慢。
List 總用於隨機訪問的方法:
void add(int index. E element) void remove(int index) E get(int index) E set(int index, E element)
2.Set(無序,不可重複)
Set裏存放的對象是無序,不能重複的,集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中。
3.Map(鍵值對,鍵惟一,值不惟一)
Map集合中存儲的是鍵值對,鍵不能重複,值能夠重複。根據鍵獲得值,對map集合遍歷時先獲得鍵的set集合,對set集合進行遍歷,獲得相應的值。
對好比下:
四.具體的集合
1. LinkedList 鏈表
在java中,全部的鏈表實際都是雙向連接的(doubly linked), 即每一個結點還存放着指向前驅結點的引用。
下面的代碼中先是添加了3個元素,而後刪去第二個位置的元素:
1 List<Integer> staff = new LinkedList<>(); 2 staff.add(10); 3 staff.add(25); 4 staff.add(48); 5 Iterator iter = staff.iterator(); 6 int a = (int) iter.next(); 7 int b = (int) iter.next(); 8 iter.remove();
LinkedList.add方法將對象添加到鏈表的尾部,可是,咱們經常須要將元素添加到鏈表中間,這時候咱們就須要用到迭代器了。
LinkedList類的 ListIteration方法 返回 一個實現了ListIterator接口的迭代器對象。 接下來演示一下越過鏈表中的第一個元素,在第二個元素以前添加元素。
List<String> staff =new LinkedList<>(); staff.add("A"); staff.add("B"); staff.add("C"); ListInterator<String> iter = staff.listIterator(); iter.next(); iter.add("D");
set方法:
1 List<String> staff =new LinkedList<>(); 2 staff.add("A"); 3 staff.add("B"); 4 staff.add("C"); 5 ListIterator<String> iter = staff.listIterator(); 6 iter.next(); 7 iter.add("D"); 8 iter.add("E"); 9 String oldValue = iter.next(); 返回的上一個元素 10 iter.set("F"); 11 System.out.println(oldValue); //B ADEFC
get方法:
List<String> staff =new LinkedList<>(); String bb = staff.get(2); System.out.println(bb);
固然這種方法效率極低,由於這是鏈表啊,。。
最後,分析下咱們爲何要使用鏈表呢?
由於使用鏈表能夠減小在列表中間插入或者刪除元素所付出的代價,若是元素較少,那麼徹底能夠使用ArrayList。 若是須要對集合中的元素進行隨機訪問,那麼就使用ArrayList()或者數組。
篇幅過長,換一頁吧: http://www.cnblogs.com/lzynuaa/p/7256833.html 。