在使用和性能方面使用List<Map<String, String>>
和List<Object>
有何區別。 假設我必須創建一個只有3種類型的鍵值對的地圖列表,我可以創建一個只有3個屬性的對象並創建一個對象列表。List <Map <String,String >> vs List <Object>
這裏的問題是兩種方法中哪一種應該在哪種情況下使用?
在使用和性能方面使用List<Map<String, String>>
和List<Object>
有何區別。 假設我必須創建一個只有3種類型的鍵值對的地圖列表,我可以創建一個只有3個屬性的對象並創建一個對象列表。List <Map <String,String >> vs List <Object>
這裏的問題是兩種方法中哪一種應該在哪種情況下使用?
讓我們先澄清一下,我們都在談論:這是
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代碼時,真的會影響您的性能。因爲你絕對想避免「這段代碼很醜,但可能會提供更好的性能」,所以想法會潛入你的設計中。專注於編寫乾淨的代碼,以簡單明瞭的方式完成工作。做從來沒有寫較少表達代碼因爲你假設它更快。當出現性能問題時 - 分析您的代碼,找出根本原因並解決問題。
但是不要讓過早的優化想法影響你的代碼的質量。
小小的一天開始新的一天! – davidxxx
前提是你的類看起來是這樣的:
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個「鑰匙」是不一樣的:
而不必多個類,可能還有一些類型的類層次的,你不能輕易做到這一點。地圖可能會更好。
爲什麼問題會重新打開?它仍然是基於意見的。 –
@MuratK。當用於不同場景時,可以從語法和性能角度考慮目標(即基於非意見的)差異。但是整個「我應該使用哪一個」往往是基於意見的最佳實踐,並可能更適合[softwareengineering.se]。它似乎可以去任何一個方面。 – Dukeling