參考資料:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526822.html
http://blog.csdn.net/touchSea/article/details/750923
先上圖,java集合的結構
集合主要實現的接口collection
接口:Collection
所有集合類的根類型,主要的一個接口方法:boolean add(Ojbect c)
add
public boolean add(E e)
- 確保此 collection 包含指定的元素(可選操作)。如果此 collection 由於調用而發生更改,則返回 true。(如果此 collection 不允許有重複元素,並且已經包含了指定的元素,則返回false。)
支持此操作的 collection 可以限制哪些元素能添加到此 collection 中來。需要特別指出的是,一些 collection 拒絕添加 null 元素,其他一些 collection 將對可以添加的元素類型強加限制。Collection 類應該在其文檔中清楚地指定能添加哪些元素方面的所有限制。
如果 collection 由於某些原因(已經包含該元素的原因除外)拒絕添加特定的元素,那麼它必須 拋出一個異常(而不是返回 false)。這確保了在此調用返回後,collection 總是包含指定的元素。
此實現總是拋出一個 UnsupportedOperationException。
-
- 指定者:
- 接口
Collection<E>
中的add
-
- 參數:
e
- 確定此 collection 中是否存在的元素。- 返回:
- 如果此 collection 由於調用而發生更改,則返回 true
- 拋出:
UnsupportedOperationException
- 如果此 collection 不支持add 操作ClassCastException
- 如果指定元素的類不允許它添加到此 collection 中NullPointerException
- 如果指定的元素爲 null,並且此 collection 不允許 null 元素IllegalArgumentException
- 如果元素的某屬性不允許它添加到此 collection 中IllegalStateException
- 如果由於插入限制,元素不能在此時間添加
其總需要注意的是:雖返回的是boolean,但不是表示添加成功與否,因爲Collection規定:一個集合拒絕添加這個元素,無論什麼原因,都必須拋出異常,這個返回值表示的意義是add()執行後,集合的內容是否改了(就是元素有無數量、位置等變化)。類似的addAll,remove,removeAll,remainAll也是一樣的。
collection的實現方法中有一個十分重要的方法是Iterator
iterator
public abstract Iterator<E> iterator()
- 返回在此 collection 中的元素上進行迭代的迭代器。
-
- 返回:
- 在此 collection 中的元素上進行迭代的迭代器。
除此之外,java還提供了一個接口方法
java.util
接口 Iterator<E>
- 所有已知子接口:
- ListIterator<E>, XMLEventReader
public interface Iterator<E>
對 collection 進行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器與枚舉有兩點不同:
- 迭代器允許調用者利用定義良好的語義在迭代期間從迭代器所指向的 collection 移除元素。
- 方法名稱得到了改進。
此接口是 Java Collections Framework 的成員。
package listTest;
import java.util.ArrayList;
import java.util.Iterator;
public class ListTest
{
/**
* @param args
*/
public static void main ( String[ ] args )
{
ArrayList<String> arrList = new ArrayList<String>( );
arrList.add( "1" );
arrList.add( "2" );
arrList.add( "3" );
Iterator<String> it = arrList.iterator( );
for ( int i = 0 ; i < arrList.size( ) ; i ++ )
{
String str = arrList.get( i );
System.out.println( "根據list集合爲:" + str );
}
for ( int i = 0 ; it.hasNext( ) ; i ++ )
{
String str = it.next( );
System.out.println( "根據itertar集合爲:" + str );
}
}
}
顯示的結果爲:
根據list集合爲:1
根據list集合爲:2
根據list集合爲:3
根據itertar集合爲:1
根據itertar集合爲:2
根據itertar集合爲:3
對於it.hasNext( ) 來說,他是判斷是否有下一個元素,與i無關1.HasSet
是Set接口的一個子類,主要的特點是:裏面不能存放重複元素,而且採用散列的存儲方法,所以沒有順序。這裏所說的沒有順序是指:元素插入的順序與輸出的順序不一致。
package listTest;
import java.util.HashSet;
import java.util.Iterator;
public class ListTest
{
/**
* @param args
*/
public static void main ( String[ ] args )
{
HashSet<String> hs = new HashSet<String>( );
hs.add( "1" );
hs.add( "1" );
hs.add( "1" );
hs.add( "1" );
Iterator it = hs.iterator( );
while(it.hasNext( ))
{
System.out.println( "各個元素爲:" + it.next( ) );
}
}
}
結果爲:
各個元素爲:1
package listTest;
import java.util.HashSet;
import java.util.Iterator;
public class ListTest
{
/**
* @param args
*/
public static void main ( String[ ] args )
{
HashSet<String> hs = new HashSet<String>( );
hs.add( "1" );
hs.add( "2" );
hs.add( "1" );
hs.add( "2" );
Iterator it = hs.iterator( );
while(it.hasNext( ))
{
System.out.println( "各個元素爲:" + it.next( ) );
}
}
}
結果爲:
各個元素爲:2
各個元素爲:1
經測試爲無序,即元素插入的順序與輸出的順序不一致,不含重複元素。
2.ArrayList
它和HashSet相反,允許存放重複元素。如果對ArrayList進行訪問,迭代器將從索引0開始,每迭代一次,索引值加1。然而,如果訪問HashSet中的元素,每個元素將會按照某種隨機的次序出現。雖然可以確定在迭代過程中能夠遍歷到集合中的所有元素,但卻無法預知元素被訪問的次序。大部分情況下,可以把ArrayList看作一個數組對待。尋址容易,插入和刪除困難。
package listTest;
import java.util.ArrayList;
import java.util.Iterator;
public class ListTest
{
/**
* @param args
*/
public static void main ( String[ ] args )
{
ArrayList<String> hs = new ArrayList<String>( );
hs.add( "1" );
hs.add( "2" );
hs.add( "1" );
hs.add( "2" );
Iterator it = hs.iterator( );
while(it.hasNext( ))
{
System.out.println( "各個元素爲:" + it.next( ) );
}
}
}
顯示結果爲:
各個元素爲:1
各個元素爲:2
各個元素爲:1
各個元素爲:2
3.LinkListLinkedList是一種可以在任何位置進行高效地插入和刪除操作的有序序列。:尋址困難,插入和刪除容易。
package listTest;
import java.util.Iterator;
import java.util.LinkedList;
public class ListTest
{
/**
* @param args
*/
public static void main ( String[ ] args )
{
LinkedList<String> hs = new LinkedList<String>( );
hs.add( "1" );
hs.add( "2" );
hs.add( "1" );
hs.add( "2" );
Iterator it = hs.iterator( );
while(it.hasNext( ))
{
System.out.println( "各個元素爲:" + it.next( ) );
}
}
}
結果爲:
各個元素爲:1
各個元素爲:2
各個元素爲:1
各個元素爲:2
4.HashMap
HashMap裏面實現一個靜態內部類Entry,其重要的屬性有 key , value, next,從屬性key,value我們就能很明顯的看出來Entry就是HashMap鍵值對實現的一個基礎bean,我們上面說到HashMap的基礎就是一個線性數組,這個數組就是Entry[],Map裏面的內容都保存在Entry[]裏面。
基本算法
//存儲時:
int hash = key.hashCode();// 這個hashCode方法這裏不詳述,只要理解每個key的hash是一個固定的int值
int index = hash % Entry[].length;
Entry[index] = value;
//取值時:
int hash = key.hashCode();
int index = hash % Entry[].length;
return Entry[index];
比較
是否有序 | 是否允許元素重複 | ||
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | |||
TreeSet | 是(用二叉排序樹) | ||
Map | AbstractMap | 否 | 使用key-value來映射和存儲數據,key必須唯一,value可以重複 |
HashMap | |||
TreeMap |
是(用二叉排序樹) |