大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java的set集合詳解

Java的set集合詳解

更新時間:2022-10-17 12:42:45 來源:動力節(jié)點 瀏覽1423次

set集合介紹

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

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

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

Set集合的遍歷方式有三種

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

2.增強for循環(huán)遍歷

3.迭代器遍歷

Set集合的實現(xiàn)類

HashSet

1.HashSet實現(xiàn)了Cloneable, Serializable兩個接口。

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

2.HashSet的底層結(jié)構(gòu)

HashSet的底層是通過HashMap實現(xiàn)

HashMap是通過數(shù)組加鏈表加紅黑樹實現(xiàn)的。

(1)add()方法

調(diào)用Map集合中的put方法。

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

PERSENT的值為new Object( );

HashCode相同會發(fā)生什么?

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

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

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

(2)remove()方法

也調(diào)用的是Map集合中的remove方法

(3)contains()方法

由此可見HashSet的底層是借助與HashMap實現(xiàn)的,底層的初始化原理,擴容原理都和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相同并且數(shù)值相同直接替換即可
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
                //如果p是一個紅黑樹結(jié)點
            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抽象類,實現(xiàn)了NavigableSet,Cloneable,Serializable接。它是非線程安全的,TreeSet是基于TreeMap實現(xiàn)的

TreeMap是通過紅黑樹實現(xiàn)的

2.TreeSet的基本使用

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

答案是報錯

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

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

在Student類中實現(xiàn)Comparable接口,重寫compareTo方法即可

解決方法二:定制排序

在創(chuàng)建TreeMap對象時,傳入一個Comparator接口,并實現(xiàn)里面的compare方法。

3.TreeSet的構(gòu)造方法

TreeSet提供了五種構(gòu)造方法。

(1)無參構(gòu)造方法,創(chuàng)建一個TreeMap類。

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

(2)指定TreeSet的比較器

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

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

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

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

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

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

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是一個哈希表和鏈表的結(jié)合,且是一個雙向鏈表

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

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

TreeSet和HashSet的區(qū)別

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

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

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

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产小视频精品 | 综合另类小说色区色噜噜 | 四虎最新紧急入口 | 草久久 | 波多野结中文字幕在线69视频 | 久久久久久久免费 | 一级片一级毛片 | www.色涩| 欧美亚洲黄色 | 日本免费三区 | 亚洲视频一 | 四虎高清成人永久免费影院 | 伊人久热这里只精品视频 | 热久久国产欧美一区二区精品 | 国产一起色一起爱 | 国产婷婷色综合成人精品 | 狠狠色丁香久久综合五月 | 国产普通话自拍 | 一级欧美一级日韩毛片99 | 国产精品香蕉一区二区三区 | 毛片黄片一级片 | 精品少妇一区二区三区视频 | 成人网18免费网 | 久久免费视频网站 | 大学生不戴套毛片视频 | 欧美日本俄罗斯一级毛片 | 成人久久视频 | 天天搞夜夜操 | 四虎免费视频 | 婷婷精品 | 国产在线观看一区二区三区四区 | 狠狠色噜噜狠狠狠狠97 | 日韩欧美国产成人 | 欧美毛片aaaaa片久久久久 | 亚洲综合色婷婷久久 | 日韩在线视频网站 | 九九福利| 亚洲国产二区 | 欧美午夜艳片欧美精品 | 国产精品午夜高清在线观看 | 亚洲欧美另类日韩 |