今天面試官問我:Set如何保證非重複?Set接口如何保證非重複
回答
答案在於add
方法的源代碼。
public boolean add(E e)
{
return m.put(e, PRESENT)==null;
}
在哪裏,PRESENT
是Object
類的對象:例如在TreeSet
源代碼add方法如下實現。m
是NavigableMap
的對象。這NavigableMap
m
被用來存儲元素e
作爲key
和PRESENT
作爲其value
給定的密鑰e
。因此,m
中的每個密鑰都具有相同的對象PRESENT
。在oracle doc中定義的put
方法Map
是:
將指定的值與此映射中指定的鍵關聯。如果地圖先前包含密鑰的映射,則舊值將被替換。
...
...
返回:與鍵,或如果爲null沒有該鍵沒有映射關聯的以前的值。 (返回null還可能表示該映射以前null與key關聯。)
所以,當你把重複的元素集合中該元素放在NavigableMap
關鍵值爲PRESENT
。如果該密鑰在NavigableMap
中不存在,則put
方法返回null
,因此 m.put(e,PRESENT)==null
返回true,並且我們知道該元素已添加。如果關鍵是已經存在於NavigableMap
然後put
方法與現有overrided的value
爲key
e
內NavigableMap
並返回舊值(它是存在),因此 m.put(e,PRESENT)==null
回報false
,我們才知道這是不是添加的元素。
這隻回答'TreeSet'的問題。問題是關於「Set」。正如問,原來的問題實際上並不合理,但這不是答案。 – EJP
Set是一種抽象數據類型,可以用多種方式實現。它本身就是合同的規範;因此它不保證任何東西。這取決於接口的執行以保證合同得到滿足。
因此,查看實現的工作方式和原因更有意思。一些常見的實現是:
- 哈希表,由
HashSet
- 平衡樹在Java中實現,因爲在Java中實現由
TreeSet
- 位設置(特殊工種),如
EnumSet
和Java實現BitSet
- 跳過列表,如由
ConcurrentSkipListSet
- 樸素陣列實現:掃描在添加它之前該元素的陣列;不經常使用。以Java語言實現
CopyOnWriteArraySet
在求職面試中,您會回答上述問題並提供解釋任何一項實施的詳細信息。面試官應該已經知道其中的一些,除非被問到,否則開始對他們進行散漫並不會對你有好處。
從規範的角度來看,指定add
方法在嘗試添加副本時必須執行的操作。爲add
方法文檔說這一點,例如:
將指定元素添加到這個組,如果它不是已存在 (可選操作)。更正式地說,如果該集合不包含元素e2使得(e == null? e2 == null:e.equals(e2)),則將該指定的元素e添加到該集合中的 。如果這個集合已經包含元素 ,則該呼叫將保持集合不變並返回false。在組合 與構造函數的限制,這確保集合從不 包含重複的元素。
從同一頁(http://docs.oracle.com/javase/6/docs/api/java/util/Set.html):
上構造的附加規定是,這並不奇怪,所有的構造必須創建一組不包含重複單元(如上所定義)。
(爲了完整起見,也有關於equals
和hashCode
規定是確保Set
正確的模型設定的抽象。)
- 1. 無效在非虛擬驗證接口
- 2. Python 3 - 非複製流接口到bytearray?
- 3. mysql - 如何讓列只能保存非重複值
- 4. 如何在文件中只保留非重複行?
- 5. 所需快速修復:口重直接驗證後
- 6. std :: set ::查找異常保證
- 7. 非重複arc4random_uniform
- 8. 與非重複
- 9. 非法重複
- 10. Neo4j Cypher:如何停止重複SET如果多個CREATES
- 11. Webgl可拼接的非重複紋理
- 12. 使用XSLT連接非重複元素和重複元素
- 13. 如何創建非重複警報?
- 14. 如何返回非重複的對象
- 15. 非接口方法
- 16. 定義'Set set = new HashSet()'時,是否設置了接口或類的實例Set?
- 17. 如何實現需要重複成員名稱的接口?
- 18. 如何在編寫接口時避免重複代碼?
- 19. 如何擺脫類'STEDataSheet'的重複接口定義
- 20. 保存或出口重量和偏見在TensorFlow非Python的複製
- 21. 如何以較少的重複調用set方法。 (Java)
- 22. 可重複的接口實現
- 23. IOS重複的接口定義
- 24. 類'NSValue'的重複接口定義
- 25. 類'GTMHTTPUploadFetcher'的重複接口定義
- 26. 組件圖中的重複接口
- 27. SUPDefaultCallbackhandler的重複接口定義
- 28. 串口ReadFile接收重複數據
- 29. 實現FBConnect時重複接口定義
- 30. IDataErrorInfo接口如何提供驗證值
*接口*只說明*實現*必須實現 - 而不是它們如何實現它。你需要詢問一個具體的實現。 –
'更正式地說,集合不包含e1和e2這樣的元素,這樣e1.equals(e2)和至多一個null元素。「也許他問的是什麼約束'Set'強制執行?例如,「equals」而不是「identity」或「hashCode」。 –
@Victor你是在問 - 面試 - 問題狂歡? – NINCOMPOOP