1. Set集合,放的元素不能重復,請問它的判斷重不重復是怎麼實現的
你好,首先要明白一點:加入Set裡面的元素必須定義equals()方法以確保對象的唯一性。
第一個問題:
TreeSet的底層實現是採用紅-黑樹的數據結構,採用這種結構可以從Set中獲取有序的序列,但是前提條件是:元素必須實現Comparable介面,該介面中只用一個方法,就是compareTo()方法。當往Set中插入一個新的元素的時候,首先會遍歷Set中已經存在的元素(當然不是採用順序遍歷,具體採用什麼方法,建議自己去看看源碼),並調用compareTo()方法,根據返回的結果,決定插入位置。進而也就保證了元素的順序。
第二個問題:
上面已經說過,加入Set裡面的元素必須定義自己的equals()方法,但是對於良好的設計風格,最好在覆蓋equals()方法的同時,也覆蓋hashCode()方法,當然,對於TreeSet而言不用覆蓋hashCode()方法也可。請記住:覆蓋hashCode()方法的目的,只有一個原因就是提高效率。
在往Set中插入新的對象時,首先會用該對象的hashCode()與已經存在對象的hashCode()做比較,如果相等,那就不能插入,如果不等,才會調用equals()方法,如果equals結果為true,說明已經存在,就不能再插入,如果為false,可以插入。
註:如果沒有覆蓋hashCode()方法,那就是只比較equals().對兩個對象equals運算,是判斷兩個對象是否相等的關鍵。
第三個問題:
2)HashSet與TreeSet區別:
1、TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值
2、HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如資料庫中唯一約束
3、HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重復。但是同一個類的對象可以放入不同的實例
2. 怎麼理解Set集合中的HashSet中的元素是無序的
要理解這個問題應該考慮到Set是個介面。介面的契約很單純,不會做過多的保證。Set的契約重點就是「元素不重復的集合」,而對順序不做保證(也就是不做限制,有序無序都可以)。實現該介面的類既可以提供有序的實現,也可以提供無序的實現。
HashSet在保存數據的時候顯然還是得按一定順序放入其背後的數組中,但順序不是用戶可控制的,對用戶來說就是「無序」。
與之相對,SortedSet介面的契約就包含了「元素不重復,且按照用戶指定的方式排序的集合」的意義。SortedSet介面滿足Set介面的契約,並額外添加的「有序」的契約。
3. 請問怎麼用Hashset存儲多種數據.
這些數據應該是相關的吧,所以應該用個對象存儲起來,比如城市降雨量對象,它有三個屬性:年份,城市,每月降雨量。
然後用hashset來存儲這個對象。
至於查找,可以轉化為迭代器,對當前對象進行判斷,直到找到滿足條件的即可;如果數據在資料庫中,直接通過SQL來查找。
4. 在java中HashSet的底層數據結構是什麼,有什麼特點
HASHSET:底層是將你加入其中的對象進行HASH排列後在放的時候,對比你放入的對象在其中是否有相同的對象存在,如果存在就不放入,反之放入。
5. java中hashset<integer>是什麼意思
樓主,HashSet是一個對象容器類.HastSet<Integer>的意思就是在HashSet內的數據都是Integer類型的數據.這是為了防止程序員自己裝入錯誤的數據,而是在編譯時自己幫助程序員進行檢測.
ps:凡是對象容器類的,都可以用Xxxxx<Object> 格式來聲明.(當然,也可以不那麼聲明,只是編譯時會有警告的)
6. hashset和hashmap的區別和聯系是什麼
hashset和hashmap的區別為:存儲不同、放入方法不同、hashcode值不同。hashset和hashmap都是存在於java.util包中的類,用於存儲數據,且都不允許集合中出現重復的元素。
一、存儲不同
1、hashset:HashSet僅僅存儲對象。
2、hashmap:HashMap儲存鍵值對。
二、放入方法不同
1、hashset:hashset使用add()方法將元素放入set中。
2、hashmap:HashMap使用put()方法將元素放入map中。
三、hashcode值不同
1、hashset:HashSet使用成員對象來計算hashcode值。
2、hashmap:HashMap中使用鍵對象來計算hashcode值。
7. arraylist,linkedlist,hashset等在什麼場景下適用
1、List,Set都是繼承自Collection介面,Map則不是
2、List特點:元素有放入順序,元素可重復 ,Set特點:元素無放入順序,元素不可重復,重復元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set 的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標來取得想要的值。)
3.Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
4.Map適合儲存鍵值對的數據
5.線程安全集合類與非線程安全集合類
LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。
下面是具體的使用介紹:
ArrayList與LinkedList的區別和適用場景
Arraylist:
優點:ArrayList是實現了基於動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存里是連著放的)。
缺點:因為地址連續, ArrayList要移動數據,所以插入和刪除操作效率比較低。
LinkedList:
優點:LinkedList基於鏈表的數據結構,地址是任意的,所以在開辟內存空間的時候不需要等一個連續的地址,對於新增和刪除操作add和remove,LinedList比較占優勢。LinkedList
適用於要頭尾操作或插入指定位置的場景
缺點:因為LinkedList要移動指針,所以查詢操作性能比較低。
適用場景分析:
當需要對數據進行對此訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時採用LinkedList。
ArrayList與Vector的區別和適用場景
ArrayList有三個構造方法:
Java代碼
public ArrayList(int initialCapacity)//構造一個具有指定初始容量的空列表。
public ArrayList()//構造一個初始容量為10的空列表。
public ArrayList(Collection<? extends E> c)//構造一個包含指定 collection 的元素的列表
Vector有四個構造方法:
Java代碼
public Vector()//使用指定的初始容量和等於零的容量增量構造一個空向量。
public Vector(int initialCapacity)//構造一個空向量,使其內部數據數組的大小,其標准容量增量為零。
public Vector(Collection<? extends E> c)//構造一個包含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)//使用指定的初始容量和容量增量構造一個空的向量
ArrayList和Vector都是用數組實現的,主要有這么三個區別:
1.Vector是多線程安全的,線程安全就是說多線程訪問同一代碼,不會產生不確定的結果。而ArrayList不是,這個可以從源碼中看出,Vector類中的方法很多有synchronized進行修飾,這樣就導致了Vector在效率上無法與ArrayList相比;
2.兩個都是採用的線性連續空間存儲元素,但是當空間不足的時候,兩個類的增加方式是不同。
3.Vector可以設置增長因子,而ArrayList不可以。
4.Vector是一種老的動態數組,是線程同步的,效率很低,一般不贊成使用。
適用場景分析:
1.Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程非同步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。
2.如果集合中的元素的數目大於目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有一定的優勢。
HashSet與Treeset的適用場景
1.TreeSet 是二差樹(紅黑樹的樹據結構)實現的,Treeset中的數據是自動排好序的,不允許放入null值
2.HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如資料庫中唯一約束
3.HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重復。但是同一個類的對象可以放入不同的實例
適用場景分析:HashSet是基於Hash演算法實現的,其性能通常都優於TreeSet。為快速查找而設計的Set,我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。
HashMap與TreeMap、HashTable的區別及適用場景
HashMap 非線程安全
HashMap:基於哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。
TreeMap:非線程安全基於紅黑樹實現。TreeMap沒有調優選項,因為該樹總處於平衡狀態。
適用場景分析:
HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允許空鍵值,而HashTable不允許。
HashMap:適用於Map中插入、刪除和定位元素。
Treemap:適用於按自然順序或自定義順序遍歷鍵(key)。
8. HashSet和TreeSet的區別
兩者主要在實現方式、數據是否有序以及是否可以放入null值等三方面存在區別。
一、實現方式
HashSet:HashSet是哈希表實現的。
TreeSet:TreeSet是二差樹實現的。
二、數據是否有序
HashSet:HashSet中的數據是無序的。
TreeSet:Treeset中的數據是自動排好序的。
三、是否可以放入null值
HashSet:可以放入null,但只能放入一個null。
TreeSet:不允許放入null值。
(8)hashset一般放什麼數據擴展閱讀
HashSet是基於HashMap實現的,HashSet底層使用HashMap來保存所有元素,因此HashSet的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成,應該為保存到HashSet中的對象覆蓋hashCode()和equals()。
1、已知實現介面有:
Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>。
2、直接已知子類:
JobStateReasons, LinkedHashSet。
9. java set 順序
set有多種,hashset,treeset和linkedhashset比較常見,hashset最常用。linkedhashset是有序的,hashset是無序的。linkedhashset是以鏈表形式存放數據的,hashset是用hash散列存放數據的。list也分好幾種,主要有arraylist和linkedlist,都是有序的,其中arraylist類比數組,linkedlist類比鏈表。arraylist是線程不同步的,也就是說多個線程同時操作一個list那麼List中存放數據的一致性就不能保證。vector是線程同步的,也就是說線程安全的。
10. 什麼時候用hashset 知乎
什麼時候用hashset
HashSet與TreeSet區別:
1、TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值
2、HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如資料庫中唯一約束
3、HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的 String對象,hashcode是一樣,所以放入的內容不能重復。但是同一個類的對象可以放入不同的實例