2017-08-01 244 views
12

在使用和性能方面使用List<Map<String, String>>List<Object>有何區別。 假設我必須創建一個只有3種類型的鍵值對的地圖列表,我可以創建一個只有3個屬性的對象並創建一個對象列表。List <Map <String,String >> vs List <Object>

這裏的問題是兩種方法中哪一種應該在哪種情況下使用?

+0

爲什麼問題會重新打開?它仍然是基於意見的。 –

+0

@MuratK。當用於不同場景時,可以從語法和性能角度考慮目標(即基於非意見的)差異。但是整個「我應該使用哪一個」往往是基於意見的最佳實踐,並可能更適合[softwareengineering.se]。它似乎可以去任何一個方面。 – Dukeling

回答

26

讓我們先澄清一下,我們都在談論:這是

List<Map<String, String>> 

List<Foo> 

其中foo對象有一些「屬性」,將被存儲在一個地圖(如鍵值對)與選項一。

在這種情況下,你絕對選擇兩個。簡單地說,因爲良好的面向對象是關於創建有用的抽象,又名模型。意思是:當你有屬於的屬性,那麼使用一個類來環繞它們是一種自然的方式。

這給你的性能略有優勢(因爲你避免了地圖訪問),但核心的一點是:它允許你編寫編譯時間檢查代碼。你看:

int foo = list.get(0).map.get("key"); 

可以在運行失敗 - 你不知道,如果地圖包含的關鍵,如果這是一個整數。

int foo = list.get(0).getFoo(); // resp. ...get(0).fieldName 

可以被編譯器檢查! (是的,那些的get()呼叫仍然在運行時失敗,但是這是你沒有得到周圍反正)

除此之外:做有關性能不擔心在這個層面上:首先,您必須瞭解在編寫Java代碼時,真的會影響您的性能。因爲你絕對想避免「這段代碼很醜,但可能會提供更好的性能」,所以想法會潛入你的設計中。專注於編寫乾淨的代碼,以簡單明瞭的方式完成工作。做從來沒有較少表達代碼因爲你假設它更快。當出現性能問題時 - 分析您的代碼,找出根本原因並解決問題。

但是不要讓過早的優化想法影響你的代碼的質量

+0

小小的一天開始新的一天! – davidxxx

4

前提是你的類看起來是這樣的:

class Foo 
{ 
    private final String a; 
    private final String b; 
    private final String c; 

    // constructor and getters 
} 

使用List<Foo>將導致:

性能

使用類的性能很可能非常相似的地圖。大多數地圖的實現,例如HashMap提供O(1)得到的操作。這不會比爲對象調用getter方法慢得多。

使用,如果3「鍵」始終是相同的:

類是可能更容易使用。如果您有Map<String, String>,則沒有簡單的方法可以強制每個地圖包含3個「A」,「B」和「C」鍵。如果有人添加關鍵「D」會怎麼樣?如果有人刪除關鍵字A會怎樣?

使用自定義類,這很容易通過構造函數實施 - 編譯時檢查。

使用,如果3個「鑰匙」是不一樣的:

而不必多個類,可能還有一些類型的類層次的,你不能輕易做到這一點。地圖可能會更好。

相關問題