您好,登錄后才能下訂單哦!
1. 概述
Java 中的Set和正好和數(shù)學上直觀的集(set)的概念是相同的。Set最大的特性就是不允許在其中存放的元素是重復的。根據(jù)這個特點,我們就可以使用Set 這個接口來實現(xiàn)前面提到的關(guān)于商品種類的存儲需求。Set 可以被用來過濾在其他集合中存放的元素,從而得到一個沒有包含重復新的集合。
2. 常用方法
按照定義,Set 接口繼承 Collection 接口,而且它不允許集合中存在重復項。所有原始方法都是現(xiàn)成的,沒有引入新方法。具體的 Set 實現(xiàn)類依賴添加的對象的 equals() 方法來檢查等同性。
各個方法的作用描述:
public int size() :返回set中元素的數(shù)目,如果set包含的元素數(shù)大于Integer.MAX_VALUE,返回Integer.MAX_VALUE;
public boolean isEmpty() :如果set中不含元素,返回true ;
public boolean contains(Object o) :如果set包含指定元素,返回true ;
public Iterator iterator() : 返回set中元素的迭代器,元素返回沒有特定的順序,除非set提高該保證的某些類的實例 ;
public boolean add(Object o) :如果set中不存在指定元素,則向set加入 ;
public boolean remove(Object o) :如果set中存在指定元素,則從set中刪除 ;
public boolean removeAll(Collection c) :如果set包含指定集合,則從set中刪除指定集合的所有元素 ;
public void clear() :從set中刪除所有元素;
3. 原理分析
HashSet的元素存放順序和添加進去時候的順序沒有任何關(guān)系;而LinkedHashSet 則保持元素的添加順序;TreeSet則是對我們的Set中的元素進行排序存放。
一般來說,當要從集合中以有序的方式抽取元素時,TreeSet 實現(xiàn)就會有用處。為了能順利進行,添加到 TreeSet 的元素必須是可排序的。 而同樣需要對添加到TreeSet中的類對象實現(xiàn) Comparable 接口的支持。對于Comparable接口的實現(xiàn)。假定一棵樹知道如何保持 java.lang 包裝程序器類元素的有序狀態(tài)。一般說來,先把元素添加到 HashSet,再把集合轉(zhuǎn)換為 TreeSet 來進行有序遍歷會更快。這點和HashMap的使用非常的類似。
其實Set的實現(xiàn)原理是基于Map上面的。Set中很多實現(xiàn)類和Map中的一些實現(xiàn)類的使用上非常的相似。Map中的“鍵值對”,其中的 “鍵”是不能重復的。這個和Set中的元素不能重復一致,其實Set利用的就是Map中“鍵”不能重復的特性來實現(xiàn)的。 HashSet的巧妙實現(xiàn):就是建立一個“鍵值對”,“鍵”就是我們要存入的對象,“值”則是一個常量。這樣可以確保, 我們所需要的存儲的信息之是“鍵”。而“鍵”在Map中是不能重復的,這就保證了我們存入Set中的所有的元素都不重復。而判斷是否添加元素成功,則是通 過判斷我們向Map中存入的“鍵值對”是否已經(jīng)存在,如果存在的話,那么返回值肯定是常量:PRESENT ,表示添加失敗。如果不存在,返回值就為null 表示添加成功。
Java中Set集合是一個不包含重復元素的Collection,首先我們先看看遍歷方法
package com.bjpowernode.test; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * 一個不包含重復元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2, * @author Owner * */ public class SetTest2 { public static void main(String[] args) { Set<String> set = new HashSet<String>(); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("e"); set.add("e");//不能放入重復數(shù)據(jù) /** * 遍歷方法一,迭代遍歷 */ for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next()+" "); } System.out.println(); System.out.println("********************"); /** * for增強循環(huán)遍歷 */ for(String value : set){ System.out.print(value+" "); } } }
注意:這里Set集合中放入的是String類型,假如我們放入一個自己定義的類實例的時候,比如Person類實例,這時候我們要自己重新hashcode和equal方法,用自己的關(guān)鍵字段來重寫,因為當使用HashSet時,hashCode()方法就會得到調(diào)用,判斷已經(jīng)存儲在集合中的對象的hash code值是否與增加的對象的hash code值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示對象已經(jīng)加進去了,就不會再增加新的對象,否則加進去。
下面分析一下Set集合的另外一個重要實現(xiàn)類TreeSet,
TreeSet使用元素的自然順序?qū)υ剡M行排序,或者根據(jù)創(chuàng)建 set 時提供的 Comparator 進行排序,具體取決于使用的構(gòu)造方法。
通俗一點講,就是可以按照排序后的列表顯示,也可以按照指定的規(guī)則排序
Set<String> set = new TreeSet<String>(); set.add("f"); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("e"); System.out.println(set);
輸出:[a, b, c, d, e, f]
按照排序后輸出
那么如果我們想讓他倒序輸出呢?當然方法很多。這里我采用指定一個規(guī)則讓他倒序輸出
package com.bjpowernode.test; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class TreeSetTest3 { public static void main(String[] args) { Set<String> set = new TreeSet<String>(new MyComparator()); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("e"); set.add("A"); for(Iterator<String> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next()+" "); } } } class MyComparator implements Comparator<String>{ @Override public int compare(String o1, String o2) { return o2.compareTo(o1);//降序排列 } }
輸出:e d c b a A
如果Set集合中放入的是我們自己定義的一個類類型呢?
注意:一定要定義一個排序規(guī)則類實現(xiàn)Comparator接口,與上面的方法類似
package com.bjpowernode.test; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class TreeSetTest2 { public static void main(String[] args) { Set<Person> set = new TreeSet<Person>(new PersonComparator()); Person p1 = new Person(10); Person p2 = new Person(20); Person p3 = new Person(30); Person p4 = new Person(40); set.add(p1); set.add(p2); set.add(p3); set.add(p4); for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next().score+" "); } } } class Person{ int score; public Person(int score){ this.score = score; } public String toString(){ return String.valueOf(this.score); } } class PersonComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { return o1.score - o2.score; } }
輸出:10 20 30 40
如果按照一個人的分數(shù)的倒序排列,只需要更改compare方法中的o2.score-o1.score
以上所述是小編給大家介紹的Java Set簡介_動力節(jié)點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網(wǎng)站的支持!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。