java8 迭代set集合_(2.1.8)Java之集合類:set、list、hashmap、hashtable等和迭代器iterator...

一、容器

常見的集合類有這些種:

實現Collection接口的:Set、List以及他們的實現類。

實現Map接口的:HashMap及其實現類

編程愛好者學習,下面我我們通過一個圖來整體描述一下:

5a9efd9a9e1debf4c0dc388e71e03bfc.jpe

這個圖片沒法顯示的很清楚,所以我將原始圖片上傳到了我的資源里:http://download.csdn.net/detail/zhangerqing/4711389。願意看清楚的就去下吧。

下面的表格也許可以更直接的表現出他們之間的區別和聯系:

接口

簡述

實現

操作特性

成員要求

Set

成員不能重復

HashSet

外部無序地遍歷成員

成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。

TreeSet

外部有序地遍歷成員;附加實現了SortedSet, 支持子集等要求順序的操作

成員要求實現caparable接口,或者使用 Comparator構造TreeSet。成員一般為同一類型。

LinkedHashSet

外部按成員的插入順序遍歷成員

成員與HashSet成員類似

List

提供基於索引的對成員的隨機訪問

ArrayList

提供快速的基於索引的成員訪問,對尾部成員的增加和刪除支持較好

成員可為任意Object子類的對象

LinkedList

對列表中任何位置的成員的增加和刪除支持較好,但對基於索引的成員訪問支持性能較差

成員可為任意Object子類的對象

Map

保存鍵值對成員,基於鍵找值操作,compareTo或compare方法對鍵排序

HashMap

能滿足用戶對Map的通用需求

鍵成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。

TreeMap

支持對鍵有序地遍歷,使用時建議先用HashMap增加和刪除成員,最后從HashMap生成TreeMap;附加實現了SortedMap接口,支持子Map等要求順序的操作

鍵成員要求實現caparable接口,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。

LinkedHashMap

保留鍵的插入順序,用equals 方法檢查鍵和值的相等性

成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。

IdentityHashMap

使用== 來檢查鍵和值的相等性。

成員使用的是嚴格相等

WeakHashMap

其行為依賴於垃圾回收線程,沒有絕對理由則少用

(上圖來源於網友的總結,已不知是哪位的原創,恕不貼出地址,如原作者看到請聯系我,必將貼出鏈接!)

實現Collection接口的類,如Set和List,他們都是單值元素(其實Set內部也是采用的是Map來實現的,只是鍵值一樣,從表面理解,就是單值),不像實現Map接口的類一樣,里面存放的是key-value(鍵值對)形式的數據。這方面就造成他們很多的不同點,如遍歷方式,前者只能采用迭代或者循環來取出值,但是后者可以使用鍵來獲得值得值。

1、HashMap和HashTable

相同點:二者都實現了Map接口,因此具有一系列Map接口提供的方法。

不同點:

1、HashMap繼承了AbstractMap,而HashTable繼承了Dictionary。

2、HashMap非線程安全,HashTable線程安全,到處都是synchronized關鍵字。

3、因為HashMap沒有同步,所以處理起來效率較高。

4、HashMap鍵、值都允許為null,HashTable鍵、值都不允許有null。

5、HashTable使用Enumeration,HashMap使用Iterator。

1-1、HashMap和ConcurrentHashMap

ConcurrentHashMap是線程安全的HashMap的實現。同樣是線程安全的類,它與HashTable在同步方面有什么不同呢?

之前我們說,synchronized關鍵字加鎖的原理,其實是對對象加鎖,不論你是在方法前加synchronized還是語句塊前加,鎖住的都是對象整體,但是ConcurrentHashMap的同步機制和這個不同,它不是加synchronized關鍵字,而是基於lock操作的,這樣的目的是保證同步的時候,鎖住的不是整個對象。

2、Set接口和List接口

相同點:都實現了Collection接口

不同點:

1、Set接口不保證維護元素的順序,而且元素不能重復。List接口維護元素的順序,而且元素可以重復。

2、關於Set元素如何保證元素不重復,我將在下面的博文中給出。

3、ArrayList和LinkList

相同點:都實現了Collection接口

不同點:ArrayList基於數組,具有較高的查詢速度,而LinkedList基於雙向循環列表,具有較快的添加或者刪除的速度,二者的區別,其實就是數組和列表的區別。上文有詳細的分析。

4、SortedSet和SortedMap

二者都提供了排序的功能。來看一個小例子:

5、TreeMap和HashMap

HashMap具有較高的速度(查詢),TreeMap則提供了按照鍵進行排序的功能。

6、HashSet和LinkedHashSet

HashSet,為快速查找而設計的Set。存入HashSet的對象必須實現hashCode()和equals()。

LinkedHashSet,具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序),於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。

7、TreeSet和HashSet

TreeSet:提供排序功能的Set,底層為樹結構。相比較HashSet其查詢速度低,如果只是進行元素的查詢,我們一般使用HashSet。

8、ArrayList和Vector

同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的。

數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半

9、Collection和Collections

Collection是一系列單值集合類的父接口,提供了基本的一些方法,而Collections則是一系列算法的集合。里面的屬性和方法基本都是static的,也就是說我們不需要實例化,直接可以使用類名來調用。下面是Collections類的一些功能列表:

二、迭代器

迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱為“輕量級”對象,因為創建它的代價小。

Java中的Iterator功能比較簡單,並且只能單向移動:

(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。

(2) 使用next()獲得序列中的下一個元素。

(3) 使用hasNext()檢查序列中是否還有元素。

(4) 使用remove()將迭代器新返回的元素刪除。

Iterator是Java迭代器最簡單的實現,為List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。list l = new ArrayList();

l.add("aa");

l.add("bb");

l.add("cc");

for (Iterator iter = l.iterator(); iter.hasNext();) {

String str = (String)iter.next();

System.out.println(str);

}

/*迭代器用於while循環

Iterator iter = l.iterator();

while(iter.hasNext()){

String str = (String) iter.next();

System.out.println(str);

}

*/

注意:使用iterator時候,不能同時對容器進行刪減,否則會丟出異常concurrentdificationexception

如果有該方面的需求,可以使用派生的兄弟成員listIterator,只針對list,可以兩個方向遍歷,同時支持元素的修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值