Java集合框架詳解之繼承set接口

Java集合框架詳解

趁着最近比較閒,靜下心來準備把關於集合框架的東西好好整理一下,邊學邊整理。近階段先是整理整體的知識點,一些接口,一些繼承類以及它們的特性,用法,後續還會有一些常用的,比較重要的類的jdk源碼剖析。

首先在集合框架的類繼承體系中包含兩個最頂層的接口:collection和map接口
1)collection表示純數據;map表示key-value鍵值對
2)集合框架的兩個“標準”的構造函數:
-沒有參數的構造函數,創建一個空的集合類
-有一個類型與基類(Collection或Map)相同參數的構造函數,創建一個與給定參數具有相同元素的新集合類

collection接口:

這裏寫圖片描述
有三個接口繼承自collection:
-set:表示數據不能有重複的集合
-list:表示的集合可以數據重複,有序的collection
-queue:jkd1.5新增,用於存儲數據,不能處理數據(不常用)
jdk不提供直接繼承collection接口的類,必須繼承子接口,有的類支持元素重複,有的支持排序,繼承自collection的子類都有一個iterator方法,該方法返回一個迭代子,可以逐一訪問collection中每一個元素。

Java集合框架詳解之繼承set接口:http://blog.csdn.net/JasonZhangOO/article/details/55807103
Java集合框架詳解之繼承list接口:http://blog.csdn.net/JasonZhangOO/article/details/55807177
Java集合框架詳解之繼承queue接口:http://blog.csdn.net/JasonZhangOO/article/details/55807197
Java集合框架詳解之繼承map接口:http://blog.csdn.net/JasonZhangOO/article/details/55807685
Java集合框架詳解之一點小總結:http://blog.csdn.net/JasonZhangOO/article/details/55808011

Collection 接口提供的主要方法:
boolean add(Object o) 添加對象到集合;
boolean remove(Object o) 刪除指定的對象;
int size() 返回當前集合中元素的數量;
boolean contains(Object o) 查找集合中是否有指定的對象;
boolean isEmpty() 判斷集合是否爲空;
Iterator iterator() 返回一個迭代器;
boolean containsAll(Collection c) 查找集合中是否有集合 C 中的元素;
boolean addAll(Collection c) 將集合 C 中所有的元素添加給該集合;
void clear() 刪除集合中所有元素;
void removeAll(Collection c) 從集合中刪除 C 集合中也有的元素;
void retainAll(Collection c) 從集合中刪除集合 C 中不包含的元素。

繼承set接口

set中不包含重複元素,有m,n,則m.equals(n)=false,可以有null元素,最多一個。
HashSet:
HashSet低層是基於HashMap實現的set,用HashMap保存數據,和HashMap一樣的性能,消耗較多內存。
-hashCode和equal()是HashMap用的,因爲無需排序所以只需要關注定位和唯一性即可。
-hashCode是用來計算hash值的,hash值是用來確定hash表索引的。
-hash表中的一個索引存放的是一張鏈表,所以還要通過equal方法循環比較鏈上的每一個對象纔可以真正定位到鍵值對應的Entry。
-put時,如果hash表中沒定位到,就在鏈表前加一個Entry,如果定位到了,則更換Entry中的value(值)並返回舊value(值)
-(關於HashMap)覆寫key的hashCode()和equal()時不要關聯可變屬性,否則屬性變了hashCode會變,equal也會爲false,這樣在Map中就找不到它了,而且這樣的對象因爲找不到它,所以得不到釋放,這樣就變成了一個無效引用。(相當於內存泄漏)

Hashset的使用:

    HashSet hashSet= new HashSet();
    String s1 = "hello";
    String s2 = "abc";
    String s3 = "edf";

    hashSet.add(s1); //在集合末尾添加
    hashSet.add(s2); //計算hashcode,hello排在abc後面
    hashSet.add(s3); //計算hashcode,edf排在hello前面

    hashSet.add(s1); //重複的元素會覆蓋     
    Object[] object = hashSet.toArray();//返回包含全部鍵的object類型數組

    System.out.println(object[0].toString());

TreeSet:
treeset底層是基於treemap實現的一個tree形有序set,需要實現comparable接口可以實現定位,按升序排列。
treeset和HashSet訪問元素都是使用iterator。

treeset的使用:

    TreeSet treeSet = new TreeSet();
    String s1 = "hello";
    String s2 = "abc";
    String s3 = "edf";

    treeSet.add(s1);
    treeSet.add(s2);
    treeSet.add(s3);

    for(Iterator it = treeSet.iterator(); it.hasNext();){  //使用iterator訪問元素
        String tmp = it.next().toString();
        System.out.println(tmp + "--");
    }

    treeSet.floor(s2); //返回此 set 中小於等於s2的最大元素;不存在返回 null        
    treeSet.ceiling(s2); //返回此 set 中大於等於s2的最小元素;不存在返回 null
    treeSet.lower(s2);  //返回此 set 中小於s2的最大元素;不存在返回 null
    treeSet.higher(s2); //返回此 set 中大於s2的最小元素;不存在返回 null
    treeSet.pollFirst(); //獲取並移除最小的元素
    String string=(String)treeSet.pollLast(); //獲取並移除最大的元素
    System.out.println(string);

HashSet和treeset比較:
1)HashSet是基於hash算法的,底層使用HashMap保存數據;treeset使用tree樹形結構,treemap實現。
2)HashSet性能優於treeset,通常使用HashSet,需要排序時使用treeset。

參考文章:
http://www.codeceo.com/article/java-collection-summary.html
http://www.codeceo.com/article/java-collection-class.html
http://www.imooc.com/article/1893
http://blog.csdn.net/softwave/article/details/4166598

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章