java 中關於集合類的整理01

以前看過一些關於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中沒有提供這個接口的直接的實現類。可是卻讓其被繼承產生了兩個接口,就是SetListSet中不能包含重複的元素。List是一個有序的集合,能夠包含重複的元素,提供了按索引訪問的方式。

MapJava.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   。

相關文章
相關標籤/搜索