Java集合類存放于 java.util 包中,是一個(gè)用來存放對(duì)象的容器。下面我們來看一下java中不重復(fù)的集合。
目前創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、新鄉(xiāng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。Set:典型實(shí)現(xiàn) HashSet()是一個(gè)無序,不可重復(fù)的集合
1、Set hashSet = new HashSet();
①、HashSet:不能保證元素的順序;不可重復(fù);不是線程安全的;集合元素可以為 NULL;
②、其底層其實(shí)是一個(gè)數(shù)組,存在的意義是加快查詢速度。我們知道在一般的數(shù)組中,元素在數(shù)組中的索引位置是隨機(jī)的,元素的取值和元素的位置之間不存在確定的關(guān)系,因此,在數(shù)組中查找特定的值時(shí),需要把查找值和一系列的元素進(jìn)行比較,此時(shí)的查詢效率依賴于查找過程中比較的次數(shù)。而 HashSet 集合底層數(shù)組的索引和值有一個(gè)確定的關(guān)系:index=hash(value),那么只需要調(diào)用這個(gè)公式,就能快速的找到元素或者索引。
③、對(duì)于 HashSet: 如果兩個(gè)對(duì)象通過 equals() 方法返回 true,這兩個(gè)對(duì)象的 hashCode 值也應(yīng)該相同。
2、Set linkedHashSet = new LinkedHashSet();
①、不可以重復(fù),有序
因?yàn)榈讓硬捎?鏈表 和 哈希表的算法。鏈表保證元素的添加順序,哈希表保證元素的唯一性
3、Set treeSet = new TreeSet();
TreeSet:有序;不可重復(fù),底層使用 紅黑樹算法,擅長(zhǎng)于范圍查詢。
* 如果使用 TreeSet() 無參數(shù)的構(gòu)造器創(chuàng)建一個(gè) TreeSet 對(duì)象, 則要求放入其中的元素的類必須實(shí)現(xiàn) Comparable 接口所以, 在其中不能放入 null 元素。
以上三個(gè) Set 接口的實(shí)現(xiàn)類比較:
共同點(diǎn):
1、都不允許元素重復(fù)
2、都不是線程安全的類,解決辦法:Set set = Collections.synchronizedSet(set 對(duì)象)
不同點(diǎn):
HashSet:不保證元素的添加順序,底層采用 哈希表算法,查詢效率高。判斷兩個(gè)元素是否相等,equals() 方法返回 true,hashCode() 值相等。即要求存入 HashSet 中的元素要覆蓋 equals() 方法和 hashCode()方法
LinkedHashSet:HashSet 的子類,底層采用了 哈希表算法以及 鏈表算法,既保證了元素的添加順序,也保證了查詢效率。但是整體性能要低于 HashSet
TreeSet:不保證元素的添加順序,但是會(huì)對(duì)集合中的元素進(jìn)行排序。底層采用 紅-黑 樹算法(樹結(jié)構(gòu)比較適合范圍查詢)
Map:key-value 的鍵值對(duì),key 不允許重復(fù),value 可以
1、嚴(yán)格來說 Map 并不是一個(gè)集合,而是兩個(gè)集合之間 的映射關(guān)系。
2、這兩個(gè)集合沒每一條數(shù)據(jù)通過映射關(guān)系,我們可以看成是一條數(shù)據(jù)。即 Entry(key,value)。Map 可以看成是由多個(gè) Entry 組成。
3、因?yàn)?Map 集合即沒有實(shí)現(xiàn)于 Collection 接口,也沒有實(shí)現(xiàn) Iterable 接口,所以不能對(duì) Map 集合進(jìn)行 for-each 遍歷。
以上就是java中的不重復(fù)的集合有哪些的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!