java--集合-Set(一)

java--集合-Set(一)

一、set接口簡介

 

  • Set是Collection子接口;
  • Set和Collection基本上一樣,一點除外:
  • Set無法記住添加的順序,不允許包含重複的元素。
  • 當試圖添加兩個相同元素進Set集合,添加操作失敗,add()方法返回false。
  • Set判斷兩個對象是否相等用equals,而不是使用==。
  • 也就是說兩個對象equals比較返回true,Set集合是不會接受這個兩個對象的。
  • 常用子類:

HashSet:散列存放

TreeSet:有序存放

二、HashCode方法對於HashSet的作用

 

  • HashSet類是Set接口最常用的實現類,採用hash算法存儲數據,具有良好的存儲和查找功能。

散列存儲:不記錄添加順序;排列順序時,順序有可能發生變化;

線程不安全的,多個線程訪問一個HashSet要使用同步代碼;

HashSet集合元素值允許是null,但是最多隻能有一個;

 

  • hash(翻譯爲哈希,或散列)算法的功能:

保證通過一個對象快速找到另一個對象;

其算法價值體現在速度,可以保證查詢快速執行;
當從HashSet中訪問元素時,HashSet先計算該元素的hashCode(也就是該對象的hashCode方法返回值),然後直接到該HashCode對應的位置取出該元素;

在這裏對象的hashCode就好比是數組裏的索引,但是不是索引;

三、HashSet元素添加

 

  • 當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,判斷已經存儲在集合中的對象的hashCode值是否與添加的對象的hashCode值一致:若不一致:直接添加進去;若一致,再進行equals方法比較,equals方法如果返回true,表明對象已經添加進去了,就不會再添加新的對象了,否則添加進去;
  • 如果我們重寫了equals方法,也要重寫hashCode方法,反之亦然;。
  • HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,並且兩個對象的hashCode方法返回值也相等。
  • 如果需要某個類的對象保存到HashSet集合中,覆寫該類的equals()和hashCode()方法,應該儘量保證兩個對象通過equals比較返回true時,他們的hashCode返回也相等。

四、HashSet元素添加實例

  HashSet添加元素:
 		Set set = new HashSet();
 		set.add("Lucy");
 			先調用"Lucy".hashCode(),判斷set集合裏是否已經有了"Lucy".hashCode():
 					1.不存在:	 就直接把Lucy添加到set集合;
 					2.存在:  再比較"Lucy"和與"Lucy"一樣Hashcode值的對象,使用對象的equals比較;
 						false: 就添加進set
 						true: 表明是一個對象,add(Object e),就返回false,添加失敗

五、TreeSet概述

 

  • 使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序;

 

參與排序的元素必須是同一類型的,不然會發生ClassCastException異常;

參與排序的元素必須是同一類型的報錯實例

set.add("春哥");
		set.add("鳳姐");
		set.add("S");
		set.add("A");
		set.add("s");
		set.add("a");
		set.add("1");
		set.add(2);  
//添加類型和上面的類型不一致,會報錯ClassCastException

 

 

  • TreeSet是SortedSet接口唯一的實現,與HashSet相比額外的方法有:

 

Comparator comparator():返回當前Set使用的Comparator,若返回null,表示以自然順序排序。

 

Object first() 返回此 set 中當前第一個(最低)元素。 

 

Object last() 返回此 set 中當前最後一個(最高)元素。 

 

SortedSet subSet(Object  fromElement, E toElement) 返回此 set 的部子集,其元素從 fromElement(包括)到 toElement(不包括)。 

 

SortedSet headSet(Object  toElement)返回此 set 的部分子集,其元素嚴格小於 toElement。 

 

SortedSet tailSet(Object  fromElement) 返回此 set 的部分子集,其元素大於等於 fromElement。 

 

六、TreeSet的排序之自然排序

 

  • TreeSet會調用元素的compareTo(Object o)方法來比較元素之間的大小關係,然後將集合裏的元素按升序排列.此時需要排序元素的類必須實現Compareble接口,並覆寫其int compareTo(Object o)方法;

 

該方法用於比較對象,若:obj1,compareTo(obj2),返回0,表示兩個對象相等,若返回一個正整數,表示obj1大於obj2,若返回一個負整數,表示obj1小於obj2;

 

 

  • 對於TreeSet集合而言,判斷兩個對象相等的標準是:

 

 

compareTo()方法比較返回 0;

 

 

七、TreeSet的排序之定製排序

 

  • TreeSet的自然排序是根據元素的大小進行升序排序的,若想自己定製排序,比如降序排序,就可以使用Comparator接口了:

 

 

該接口包含int compare(Object o1,Object o2)方法,用於比較兩個對象的大小,比較結果和compareTo方法一致;

 

 

 

  • 要實現定製排序,需要在創建TreeSet集合對象時,提供一個一個Comparator對象,該對象裏負責集合元素的排序邏輯;

 

 

 

TreeSet(Comparator comparator) 

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章