輸入:假設我的對象爲Person
。它有2個屬性即地圖與列表
ssnNo
- 社會安全號name
。
在一方面我必須Person
的List
一個對象(具有獨特ssnNo),並在另一方面我有含人Map
的ssnNo
作爲密鑰和人的name
作爲值。
輸出:我需要人名使用其ssnNo。
問題:
哪種方法遵循了我一直在使用列表或地圖的上方即提到的2? (我認爲明顯的答案是地圖)。
如果是地圖,不管數據集是大還是小,總是推薦使用地圖?我的意思是地圖上有任何性能問題。
輸入:假設我的對象爲Person
。它有2個屬性即地圖與列表
ssnNo
- 社會安全號name
。在一方面我必須Person
的List
一個對象(具有獨特ssnNo),並在另一方面我有含人Map
的ssnNo
作爲密鑰和人的name
作爲值。
輸出:我需要人名使用其ssnNo。
問題:
哪種方法遵循了我一直在使用列表或地圖的上方即提到的2? (我認爲明顯的答案是地圖)。
如果是地圖,不管數據集是大還是小,總是推薦使用地圖?我的意思是地圖上有任何性能問題。
你說得對,你應該在這種情況下使用地圖。與列表相比,使用map沒有任何性能問題,當數據較大時,性能明顯優於列表。地圖使用鍵的哈希碼來檢索條目,與數組使用索引檢索值的方式類似,可以獲得良好的性能
這看起來像是適合Map<Long, Person>
的情況,它將社會安全號碼映射到相關的Person
。您可能需要考慮從Person
中刪除ssnNo
字段,以避免任何冗餘(因爲您會將這些值存儲爲映射中的鍵)。
一般而言,Map
s和List
s是非常不同的結構,每個結構都適用於不同的環境。只要你想維護一組鍵值對,你就可以使用前者,這使得你可以方便快捷地(即在常量時間內)根據鍵(這是你想要做的)查找值。當你只是想存儲一個有序的,線性的元素集合時,你會使用後者。
我覺得很有道理有Person
對象,但它也有道理使用Map
在List
,因爲查找的時間會更快。我可能會使用一個Map
與SSNs
爲keys
和Person
對象作爲values
:
Map<SSN,Person> ssnToPersonMap;
使用map特別是使用散列表實現的地圖將比列表更快,因爲這將允許您在常量時間O(1)中獲取名稱。然而,使用列表你需要做一個線性搜索或者可能是一個比較慢的二分搜索。
地圖是要走的路。地圖表現非常好,而且它們與查找列表相比的優勢越大,數據集越大。
當然,也有一些重要的性能方面的考慮:
確保你有一個很好的哈希碼(以及相應的平等)的實施,使您的數據將在Map的桶被均勻地分佈。
確保您在分配地圖時預先設置好地圖的大小(如果可能的話)。地圖會自動調整大小,但調整大小操作本質上需要重新插入每個先前的元素到新的更大的地圖中。
感謝羅伯明確的解釋。 (對不起,最近的回覆..我出去了) – sg1
考慮到你的收藏的大小作爲一個障礙,我認爲谷歌番石榴圖書館應該是一個不錯的選擇。 – zerocool