JDK | Set如何保證元素不重複

在Java的Set體系中,根據實現方式不同主要分爲兩大類。HashSet和TreeSet。

1、HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重複,就如數據庫中唯一約束

2、TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值

 

在HashSet中,基本的操作都是有HashMap底層實現的,因爲HashSet底層是用HashMap存儲數據的。

當向HashSet中添加元素的時候,首先計算元素的hashcode值,然後通過擾動計算和按位與的方式計算出這個元素的存儲位置,如果這個位置位空,就將元素添加進去;如果不爲空,則用equals方法比較元素是否相等,相等就不添加,否則找一個空位添加。

 

TreeSet的底層是TreeMap的keySet(),而TreeMap是基於紅黑樹實現的,紅黑樹是一種平衡二叉查找樹,它能保證任何一個節點的左右子樹的高度差不會超過較矮的那棵的一倍。

TreeMap是按key排序的,元素在插入TreeSet時compareTo()方法要被調用,所以TreeSet中的元素要實現Comparable接口。TreeSet作爲一種Set,它不允許出現重複元素。TreeSet是用compareTo()來判斷重複元素的。

 

轉自:https://github.com/hollischuang/toBeTopJavaer/blob/master/basics/java-basic/set-repetition.md

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