學習筆記分享 Set集合實現類 HashSet

2021-09-14 08:34:59 字數 1528 閱讀 7713

**set是無序的,用於儲存不重複的物件集合。在set集合中儲存的物件中,不存在equals比較為true的情況。**

1)hashset和treeset是set集合的兩個常見的實現類,分別用hash表和排序二叉樹的方式實現了set集合。hashset是使用雜湊演算法實現set的。

2)set集合沒有get(int index)方法,我們不能像使用list那樣,根據下標獲取元素。像獲取元素需要使用iterator

3)向集合新增元素也使用add方法,但是add方法不是向集合末尾追加元素,因為set是無序的。

4)巨集觀上講:元素的順序和存放順序是不同的,但是在內容不變的前提下,存放順序是相同的,但是我們在使用的時候,要當做無序的使用。

6)對於重寫了equals方法的物件,強烈要求重寫繼承自object類的hashcode方法,因為重寫hashcode方法與否會對集合操作有影響!

7)重寫hashcode方法需要注意的兩點:

①與equals方法的一致性,即equals比較返回為true的物件其hashcode方法返回值應該都相同。

②hashcode返回的資料應該符合hash演算法要求,,如果有很多物件的hashcode方法都相同,則會大大降低hash表的效率。

一般情況下,可以使用ide(如eclipse)方法提供的工具自動生成hashcode方法。

8)boolean contains(object o)方法:檢視物件是否在set中被包含。

9)hashcode方法和equals方法都重寫時對hashset的影響:

將兩個物件同時放入hashset集合,發現存在,不在放入(不重複集)。

當我們重寫了point的equals方法和hashcode方法後,我們發現雖然p1和p2是兩個物件,但是我們將他們同時放入集合時,p2物件並沒有新增進集合。

因為p1放入後,p2放入時根據p2的hashcode計算的位置相同,且p2與該集合的p1的equals比較為true,hashset認為該物件已存在,所以拒絕將p2存入集合。

10)不重寫hashcode方法,但是重寫了equals方法對hashset的影響:

兩個物件都可以放入hashset集合中,因為兩個物件具有不同的hashcode值,那麼當他們放入集合時,通過hashcode值進行的雜湊演算法結果不同。

那麼他們會被放入集合的不同位置,位置不相同,hashset則認為他們不同,所以他們可以全部被放入集合。

11)重寫了hashcode方法,但是不重寫equals方法對hashset影響:

在hashcode相同的情況下,存放元素時,他們會在相同的位置,hashset會在相同位置上將放入的元素物件與該位置其他物件進行一次equals比較,

若不同,則將其存入在同乙個位置存入若干元素,這些元素會放入乙個鍊錶中。

由此可以看出,我們應該盡量使用多種類不同物件的hashcode值不同,這樣才可以提高hashset在檢查元素時的效率,否則可能檢索效率還不如list.

12)結論:不同物件存放時,不會儲存hashcode相同並且equals相同的物件,缺一不可以。否則hashset不認為他們時重複物件。

集合,Set實現類筆記

回顧 list體系 棧 佇列 陣列 鍊錶 list體系的三個子類 arraylist 資料結構 陣列 vector 資料結構 陣列 特有功能 linkedlist 資料結構 鍊錶 特有功能 first last 面試題 模擬棧結構 泛型 明確資料型別的工作放在建立物件 或者 呼叫方法的時候 型別轉換...

PCIe學習筆記分享

本總結隨著dm8168中pcie的學習,以及pcie原理的學習而新增,都是一些零碎的知識點,有部分個人理解,將來溫故知新用。欠奉。pcie裝置需要使用refclk refclk作為本地參考時鐘,其時鐘頻率固定為100mhz,在dm8168系統中,需要提供兩個100mhz時鐘,乙個給dm8168用於檢...

PHP學習筆記分享(一)

apache目錄介紹 bin 二進位制 windows下的一些可執行檔案 conf 配置檔案目錄 htdocs apache預設的主機位址 根目錄 modules 模組 apache的所有功能都是模組化的,想要什麼內容,用相應模組載入 httpd.exe的詳細應用 1.伺服器程序 執行之後才能工作 ...