• <menu id="eeoky"><tt id="eeoky"></tt></menu>
  • <nav id="eeoky"></nav>
  • 專注IT教育14年 全國咨詢/投訴熱線:400-8080-105
    動力節點LOGO圖
    始于2009,口口相傳的IT黃埔軍校
    首頁 hot資訊 Java中set集合詳解

    Java中set集合詳解

    更新時間:2022-09-23 09:45:55 來源:動力節點 瀏覽486次

    set集合框架體系圖

    set集合介紹

    Set接口繼承了Collection接口,含有許多常用的方法。

    int size();返回集合的長度
    boolean isEmpty();判斷集合是否為空
    boolean contains(Object o);是否包含某個值
    boolean add(E e);添加元素
    boolean remove(Object o);刪除元素

    Set接口的存儲特點是無序不可重復,可以存放唯一一個null值,Set的常用實現類有HashSet,TreeSet。

    Set集合的遍歷方式有三種

    1.直接打印System.out.println(set);

    2.增強for循環遍歷

    3.迭代器遍歷

    Set集合的實現類

    HashSet

    1.HashSet實現了Cloneable, Serializable兩個接口。

    Cloneable:實現了clone()方法可以實現克隆功能
    Serializable:表示可以被序列化傳輸。

    2.HashSet的底層結構

    HashSet的底層是通過HashMap實現

    HashMap是通過數組加鏈表加紅黑樹實現的。

    (1)add()方法

    調用Map集合中的put方法。

    將要添加的元素作為Map集合中的key,PRESENT作為Map集合中的Value;

    PERSENT的值為new Object( );

    HashCode相同會發生什么?

    產生hash碰撞,hash碼相同,則通過key的equals()方法比較值是否相同.

    key值不相等:則會在該節點的鏈表結構上新增一個節點(如果鏈表長度>=8且 數組節點數>=64 鏈表結構就會轉換成紅黑樹)

    key值相等:則用新的value替換舊的value

    (2)remove()方法

    也調用的是Map集合中的remove方法

    (3)contains()方法

    由此可見HashSet的底層是借助與HashMap實現的,底層的初始化原理,擴容原理都和HashSet集合相同·

    3.HashSet的去重原理

    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                       boolean evict) {
            Node<K,V>[] tab; Node<K,V> p; int n, i;
            if ((tab = table) == null || (n = tab.length) == 0)
                n = (tab = resize()).length;
            if ((p = tab[i = (n - 1) & hash]) == null)
                tab[i] = newNode(hash, key, value, null);
            else {
                Node<K,V> e; K k;
                 //如果Hash相同并且數值相同直接替換即可
                if (p.hash == hash &&
                    ((k = p.key) == key || (key != null && key.equals(k))))
                    e = p;
                    //如果p是一個紅黑樹結點
                else if (p instanceof TreeNode)
                    e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
                else {
                    for (int binCount = 0; ; ++binCount) {
                        if ((e = p.next) == null) {
                            p.next = newNode(hash, key, value, null);
                            if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                                treeifyBin(tab, hash);
                            break;
                        }
                        if (e.hash == hash &&
                            ((k = e.key) == key || (key != null && key.equals(k))))
                            break;
                        p = e;
                    }
                }
                if (e != null) { // existing mapping for key
                    V oldValue = e.value;
                    if (!onlyIfAbsent || oldValue == null)
                        e.value = value;
                    afterNodeAccess(e);
                    return oldValue;
                }
            }
            ++modCount;
            if (++size > threshold)
                resize();
            afterNodeInsertion(evict);
            return null;
        }

    TreeSet

    1.TreeSet是一個有序的集合,它的作用是提供有序的Set集合。它繼承了AbstractSet抽象類,實現了NavigableSet,Cloneable,Serializable接。它是非線程安全的,TreeSet是基于TreeMap實現的

    TreeMap是通過紅黑樹實現的

    2.TreeSet的基本使用

    如果我們像使用HashSet一樣使用TreeSet這樣是否會報錯呢?

    答案是報錯

    如何解決呢?解決辦法有兩種

    解決方法一:(自然排序)、

    在Student類中實現Comparable接口,重寫compareTo方法即可

    解決方法二:定制排序

    在創建TreeMap對象時,傳入一個Comparator接口,并實現里面的compare方法。

    3.TreeSet的構造方法

    TreeSet提供了五種構造方法。

    (1)無參構造方法,創建一個TreeMap類。

    public TreeSet() {
    this(new TreeMap<E,Object>());
    }

    (2)指定TreeSet的比較器

    public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
    }

    (3)創建一個TreeSet,并將Collection c集合中的元素加入到TreeSet中

    public TreeSet(Collection<? extends E> c) {
    this();
    addAll?;
    }

    (4)構造一個包含相同元素并使用與指定排序集相同的順序的新樹集。

    public TreeSet(SortedSet s) {
    this(s.comparator());
    addAll(s);
    }

    (5)構造一個由指定的可導航地圖支持的集合。

    TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
    }

    4.TreeSet的去重方法:前面講到hashSet去重的方法是hashcode和equals方法判斷相同則覆蓋,TreeSet是通過compareTo方法的返回值來判斷是否相同,如果返回值為0則認定是重復元素

    5.TreeSet的常用方法

    public boolean add(E e) {
    return m.put(e, PRESENT)==null;
    }`
    public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
    }
    public void clear() {
    m.clear();
    }
    m為底層的HashMap集合,

    LinkedHashSet

    LinkedHashSet是一個哈希表和鏈表的結合,且是一個雙向鏈表

    并且linkedHashSet是一個非線程安全的集合。如果有多個線程同時訪問當前linkedhashset集合容器,并且有一個線程對當前容器中的元素做了修改,那么必須要在外部實現同步保證數據的準確性。

    LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法操作上又與 HashSet 相同

    TreeSet和HashSet的區別

    1.TreeSet 是二叉樹(紅黑樹)實現的,Treeset中的數據是自動排好序的,不允許放入null值。

    2.HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復。

    3.HashSet要求放入的對象實現HashCode()和equals()方法,TreeSet要求放入的對象繼承Comparable接口并實現compareTo方法或者在建TreeMap對象時,傳入一個Comparator接口,并實現里面的compare方法

    提交申請后,顧問老師會電話與您溝通安排學習

    免費課程推薦 >>
    技術文檔推薦 >>
    返回頂部
    疯狂婬荡乱婬A片中文,特级西西人体444WWw高清大胆,国产性XXXX18免费观看视频,中文字幕乱伦,free性满足HD国产精品,牛人女厕偷拍1区2区