2015-10-06 61 views
0

我從我的java課程中知道,當我實現一個接口時,我必須構建該接口中存在的所有方法。但是當我看了一下HashSet我觀察到它沒有構建Set接口的所有方法。爲什麼?爲什麼HashSet不會構建Set接口的所有方法

+0

你是什麼意思沒有「建立所有的方法?」 'Set'中定義的每個方法都由'HashSet'實現,或者由它的超類實現。 – resueman

+0

您認爲哪些方法未實現? –

+0

如果沒有實現所有必需的方法,(具體)類將無法編譯。 – ergonaut

回答

0

查看超類AbstractSet。來自java文檔:「這個類提供了Set接口的骨架實現,以最小化實現這個接口所需的工作。」 HashSet擴展了AbstractSet,所以在AbstractSet中沒有實現的東西在HashSet中實現。

0

HashSet實現了Set接口的所有方法。並非它們全部直接出現在HashSet代碼中,因爲一些(例如removeAll)從AbstractSet繼承,而其他(例如toArray)從AbstractCollection繼承。你可以在documentation中看到這一切。

這些抽象類非常有用。如果您擴展AbstractSet,則您只需覆蓋size,containsiterator,即可免費獲得正確運行的其他方法的版本(例如,containsAll,hashCode,toArray,stream)。無論如何,您可以選擇覆蓋它們以提高效率。

3

如果你看一下HashSet類的聲明,你可以看到,除了實施SetCloneableSerializable,它擴展了AbstractSet類,它本身延伸AbstractCollection

例如,兩個toArray()過載在AbstractCollection類中實現。 addAll(),containsAll(),retainAll()removeAll()方法也是如此。此外,removeAll()AbstractSet中被覆蓋。

equals()hashCode()方法在Object中定義,在AbstractSet中被覆蓋。

希望這有助於...

傑夫

相關問題