Java Set簡介_動力節(jié)點Java學院整理
1. 概述
Java 中的Set和正好和數(shù)學上直觀的集(set)的概念是相同的。Set最大的特性就是不允許在其中存放的元素是重復的。根據(jù)這個特點,我們就可以使用Set 這個接口來實現(xià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的元素存放順序和添加進去時候的順序沒有任何關系;而LinkedHashSet 則保持元素的添加順序;TreeSet則是對我們的Set中的元素進行排序存放。
一般來說,當要從集合中以有序的方式抽取元素時,TreeSet 實現(xiàn)就會有用處。為了能順利進行,添加到 TreeSet 的元素必須是可排序的。 而同樣需要對添加到TreeSet中的類對象實現(xiàn) Comparable 接口的支持。對于Comparable接口的實現(xiàn)。假定一棵樹知道如何保持 java.lang 包裝程序器類元素的有序狀態(tài)。一般說來,先把元素添加到 HashSet,再把集合轉換為 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方法,用自己的關鍵字段來重寫,因為當使用HashSet時,hashCode()方法就會得到調用,判斷已經(jīng)存儲在集合中的對象的hash code值是否與增加的對象的hash code值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示對象已經(jīng)加進去了,就不會再增加新的對象,否則加進去。
下面分析一下Set集合的另外一個重要實現(xiàn)類TreeSet,
TreeSet使用元素的自然順序對元素進行排序,或者根據(jù)創(chuàng)建 set 時提供的 Comparator 進行排序,具體取決于使用的構造方法。
通俗一點講,就是可以按照排序后的列表顯示,也可以按照指定的規(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)站的支持!
相關文章
Java中Integer.valueOf,parsetInt() String.valueOf的區(qū)別和結果代碼解析
本文通過代碼給大家講解了JAVA中Integer.valueOf, parsetInt() String.valueOf的區(qū)別和結果,需要的朋友可以參考下2018-05-05
Java map.getOrDefault()方法的用法詳解
這篇文章主要介紹了Java map.getOrDefault()方法的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
使用Java Servlet生成動態(tài)二維碼的實現(xiàn)步驟
在現(xiàn)代互聯(lián)網(wǎng)時代,二維碼廣泛應用于各個領域,包括支付、認證、信息傳遞等,在Web開發(fā)中,通過Java Servlet生成動態(tài)二維碼是一個常見的需求,本文將介紹如何使用Java Servlet結合Google的ZXing庫生成動態(tài)二維碼,需要的朋友可以參考下2023-11-11
利用Postman和Chrome的開發(fā)者功能探究項目(畢業(yè)設計項目)
這篇文章主要介紹了利用Postman和Chrome的開發(fā)者功能探究項目(畢業(yè)設計項目),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
java compare compareTo方法區(qū)別詳解
本文主要介紹了java compare compareTo方法區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Java排序算法三之歸并排序的遞歸與非遞歸的實現(xiàn)示例解析
這篇文章主要介紹了Java排序算法三之歸并排序的遞歸與非遞歸的實現(xiàn)示例解析,文章通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
Java在Map轉Json字符串時出現(xiàn)"\"轉義字符的解決辦法
當一個Map被轉成Json字符串后,被添加到另一個Map中,會出現(xiàn)被加上“\”轉義字符的情況,這個時候該如何解決呢,下面就來和小編一起了解一下2023-07-07
SpringBoot集成FastDFS+Nginx整合基于Token的防盜鏈的方法
這篇文章主要介紹了SpringBoot集成FastDFS+Nginx整合基于Token的防盜鏈的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04

