前言:
前面介紹了Java的數據結構List、Map,今天抽空學習總結一下另一種數據結構Set。
Set介紹
Set相對於List、Map是最簡單的一種集合。集合中的對象不按特定的方式排序,並且沒有重復對象。
特點:
- 它不允許出現重復元素;
- 不保證和政集合中元素的順序
- 允許包含值為null的元素,但最多只能有一個null元素
Set是一個接口,實例化Set可以采用下面的方式:
- HashSet: HashSet類按照哈希算法來存取集合中的對象,存取速度比較快
- TreeSet :TreeSet類實現了SortedSet接口,能夠對集合中的對象進行排序
Set的基本操作:
- boolean add(Object o) :向集合中加入一個對象的引用
- void clear() :刪除集合中所有的對象,即不再持有這些對象的引用
- boolean isEmpty() :判斷集合是否為空
- boolean contains(Object o): 判斷集合中是否持有特定對象的引用
- Iterartor iterator() : 返回一個Iterator對象,可以用來遍歷集合中的元素
- boolean remove(Object o):從集合中刪除一個對象的引用
- int size() :返回集合中元素的數目
- Object[] toArray() :返回一個數組,該數組中包括集合中的所有元素
Set的使用
添加數據
Set<Integer> hashSet = new HashSet<Integer>(); hashSet.add(3); hashSet.add(2); hashSet.add(5); hashSet.add(1); //模擬添加一個重復數據 hashSet.add(2); Log.e(TAG,"set hashSet :"+hashSet+" size : "+hashSet.size()); Set<Integer> treeSet = new TreeSet<>(); treeSet.add(3); treeSet.add(2); treeSet.add(5); treeSet.add(1); Log.e(TAG,"set treeSet :"+treeSet +" size : "+treeSet.size());
運行結果:
![]()
通過運行結果可以看出,Set是不可重復的,TreeSet是有序的,HashSet是無序的。
TreeSet實現排序默認是升序,想要實現自定義排序可以通過傳進去一個Comparator或者TreeSet的添加對象實現Comparator接口。
Set遍歷
for循環方式
for (Integer integer :hashSet){ Log.e(TAG,"set integer :"+integer); }
迭代器方式
Iterator<Integer> iterator =hashSet.iterator(); while (iterator.hasNext()){ Integer integer=iterator.next(); Log.e(TAG,"set integer :"+integer); }
知識擴展:
最近在阿里java開發手冊上看到了這句話:Map/Set 的 key 為自定義對象時,必須重寫 hashCode 和 equals。這里Set集合中放入的是String類型,假如我們放入一個自己定義的類實例的時候,比如Person類實例,這時候我們要自己重新hashcode和equal方法,用自己的關鍵字段來重寫,因為當使用HashSet時,hashCode()方法就會得到調用,判斷已經存儲在集合中的對象的hash code值是否與增加的對象的hash code值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示對象已經加進去了,就不會再增加新的對象,否則加進去
總結:
主要重新熟悉一下Map這種數據結構,更好的在項目中使用不可重復的數據結構。
