1. 程式人生 > >Set集合基礎

Set集合基礎

con 一起 聯動 開始 指定 不同 但是 增刪改查 val

關於hashCode
hashSet的使用
簡單的來說,就是,如果兩個對象的所有值都相同(hashCode值相同),那麽就開始判斷equals方法是否為false,如果為false就判定這兩個對象不是重復的,如果為true就判斷是重復的,即:
先判斷hashCode值是否相同(對象中的元素是否有不同的,有的話就是不同,都相同就相同),然後再判斷equals是否相同(重寫之後的equals方法,通過比較對象引用是不是為空,當前引用的getClass方法是不是滿足,還有對象的所有屬性是否相同),如果相同,就返回true,否則就返回false,理解這麽多就夠了。具體比較hashCode的方法,看代碼(比較方法:設初始值為31,數字初始值為1,將數字的值加一起然後再判斷字段是否為空,為空的話就+0,否則就加上字段值(字段的hashCode()方法返回的是一個整數,也就是這個字段的地址值),然後結果就是hashCode值)


Set:
特點:無序,不重復,沒有整數索引

HashSet的add方法查找不能去重的原因
1.查看hashCode值是否相等
2.查看地址是否相等
3.查看equals值是否相等

重寫hashCode()方法和equals()方法去實現HashSet存儲自定義對象時的去重

Collections工具類的查詢方法:
1.static int binarySearch(List list,Object key):用於查詢元素的位置,註意,被查詢的集合必須是有序的(Set不能用)
2.static void copy(List dest,List src):用於列復制,後面的復制到前面
3.static void fill(List list,Object obj);用於填充,將list中的元素全部替換成obj
4.static void reserve(List list);反轉,將List列的值的順序反過來
5.static void shuffle(List list);隨機置換,將整個List的元素隨機換位置(實現洗牌)
6.static void sort(List<T> list);將list中的元素按自然順序排列(list中為基本類型)
7.static void swap(List list,int i,int j);將list中指定的兩個索引位置的值互換

Map的增刪查
1.添加 V put(K key,V value);返回值是V
2.刪除 void clear();
3.查詢 V get(Object key);
int size();
4.判斷 boolean containsKey(Object key);
boolean containsValue(Object value);
boolean isEmpty();
5遍歷:
1.用Set存儲鍵值(因為Set不允許重復),然後用Collection存儲對應值(因為Collection允許出現重復)
2.用Map的Entry方法,eg:Set<Map.Entry<K,V>> entrys = Map對象.entrySet();


總結:
1.單列集合從上到下依次為:Collection(根集合)--->List(ArrayList,LinkedList(沒講)),Set(HashSet,LinkedHashSet(沒講))
雙列集合從上到下依次為:Map--->HashMap,LinkedHashMap(沒講)

2.List和Set的區別:List為有序的可重復的集合,Set為無序的不可重復的集合,並且沒有整數索引
3.因為Set是接口,所以用多態創建HashSet的對象,而HashSet實際上是HashMap的包裝類,其本質是HashCode()
4.使用HashSet的時候重寫equals()和hashCode()的方法
4.Set和Map的相同點和不同點
相同點:都是集合,底層實現都是HashCode();
不同點:Set只有一個獲取鍵值的方法,但是Map有對應的Hash表值,有自己的獲取key和value的方法,Map可以用entry遍歷
5.LinkedList底層是鏈表,增刪快查詢慢,ArrayList底層是數組,查詢快增刪慢
6.HashMap和Set之間的聯動
HashMap的keySet()返回的是Set的映射視圖(就是Set集合),將HashMap中的鍵存入Set中
7.Collections工具類是專門為List接口提供的,同時,被接口實現的類也能使用,包括增刪改查的方法

Set集合基礎