溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java Set簡介_動力節(jié)點Java學院整理

發(fā)布時間:2020-09-04 15:34:03 來源:腳本之家 閱讀:130 作者:mrr 欄目:編程語言

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)站的支持!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI