2011-09-07 173 views
2

可以說我們有一堆數據(溫度,風力,壓力),最終作爲大量浮點數組來使用。 例如:使用自定義Java對象還是使用HashMaps來存儲數據更好

float[] temp = //get after performing some processing (takes time) 
float[] wind = 

說,我們要存儲在內存中的這些值不同時段的。它是更好地把這些像一個HashMap:

HashMap maphr1 = new HashMap(); 
maphr1.put("temp",temp); 
maphr1.put("wind",wind); 
... 

或者是它最好創建一個Java對象,如:

public class HourData(){ 

    private float[] temp,wind,pressure; 

    //getters and setters for above! 

} 
... 
// use it like this 
HourData hr1 = new HourData(); 
hr1.setTemp(temp); 
hr1.setWind(wind); 

出其在性能方面不如這兩種方法,可讀性,良好的面向對象的做法等

+1

你應該擔心的第一件事是它是否適用於你自己。不要讓其他人決定什麼是「良好的面向對象操作」。 – Timbits

+2

@Timbits我恭敬地不同意。尤其對於剛開始學習面向對象的人來說,遵循嚴格的最佳實踐比做自己的事情要好得多。與大多數學科一樣,只有在掌握了最佳實踐之後,才能打破最佳實踐。 :) –

回答

0

你已經提到了一堆數據,所以我寧願把它看作數據的集合。

所以答案是,如果Java集合框架已經可用,那麼爲什麼要爲你寫一個。

你應該看看Java集合類,看看哪些符合你要求的好,無論是併發訪問,快速檢索時間或快速增加時間等等等等。

希望這有助於

EDIT-- -

向此添加一個更多維度。

您正在構建的應用程序的類型也會影響您的方法。

上述討論正確地提到可讀性,靈活性和性能作爲您設計的驅動標準。

但是類型的應用您正在建設的也是影響因素之一。

例如,假設您正在構建一個Web應用程序。

長時間存儲在內存中的對象可能在應用程序或會話範圍中。所以你必須通過設計使其不可變,或者將它用於線程安全的方式。

在不同實現中保持相同的業務數據應按照OOP或最佳實踐進行設計,但基礎架構或應用程序邏輯應更多地由您的框架驅動。

我覺得你在說什麼,就像在內存中保留一個對象很長時間更多的是一個框架驅動的前景,因此我建議使用Java集合並把你的業務對象放在裏面。要點是

  1. 併發訪問控制
  2. 永恆設計
+1

我的問題不是數據如何來。忽略開始部分,我只是設置了一個上下文。我問的是,在你需要存儲數據的情況下,使用HashMap還是Java對象會更好? – hash

+0

嗯.....我讀它就好像他正在創建自己的收藏對象,我想我是對的。因此說,嘗試使用Java集合對象而不是創建自己的 –

0

爲了提高可讀性我肯定會去的對象,因爲它更有意義。特別是因爲您存儲了不同的數據集,例如風多頭與臨時多頭有不同的含義。

除此之外,您還可以存儲其他信息,如測量的位置和時間。

+0

感謝您的快速回復,您提出了一個很好的觀點 – hash

0

那麼如果你沒有任何關鍵來區分同一對象的不同實例。我將創建HourData對象並將它們存儲在數組列表中。

將數據放入包含的對象中總會增加可讀性。

0

如果您有一個有限且已經定義好的參數列表,那麼最好使用第二種方法。

  1. 在性能方面:你不需要在HashMap中
  2. 搜索鍵在可讀性方面:data.setTemp(temp)map.put("temp", temp)更好。第一種方法的好處之一是在編譯過程中會遇到輸入錯誤
  3. 就良好的OOP實踐而言:第一種方法與OOP實踐無關。使用第二種方法,您可以輕鬆更改實施方式,添加新方法,提供多種替代數據對象實施方式等。

但是,如果您不知道參數,並且想要使用未分類(可擴展)的一組參數。

+0

是的它是一個有限定義的參數列表。我最初的想法也是使用一個對象。然後我發現了HashMaps,認爲我會對它做一些幻想......但最後我只是感到困惑LOL。謝謝 – hash

6

你最好具有HourData類存儲設定溫度,風,以及壓力值,如:

public class HourData { 
    private float temp, wind, pressure; 
    // Getters and setters for the above fields 
} 

如果你需要存儲超過一組值,您可以使用一個數組或一組HourData對象。例如:

HourData[] hourDataArray = new HourData[10000]; 

與將數據數組存儲在您的HourData類中相比,這最終要更加靈活,性能和直觀。

靈活性

我說,這種做法更加靈活,因爲它留下什麼樣的集合實現的使用的選擇(例如ArrayListLinkedList等)的HourData類的用戶。而且,如果他/她只想處理一組值,這種方法不會強迫他們處理數組或集合。

性能

假設你有HourData實例的列表。如果以所描述的方式使用三個浮點數組,則訪問第i個temp,windpressure值可能會導致在內存中訪問三個單獨的pages。發生這種情況是因爲所有temp值都將連續存儲,其後是所有wind值,後面是所有pressure值。如果您使用一個類將這些值組合在一起,那麼訪問第temp,windpressure值的速度會更快,因爲它們都將在內存中彼此相鄰存儲。

直觀

如果使用HashMap,誰需要訪問的任何字段將不得不提前知道字段名稱。 HashMap對象更適合在編譯時不知道鍵的鍵/值對。使用包含明確定義字段的HourData類,只需查看類API即可知道HourData包含temp,windpressure的值。

此外,數組字段的getter和setter方法可能會造成混淆。如果我只想將一組temp,windpressure值添加到列表中,該怎麼辦?我是否必須獲取每個數組,並將新值添加到它們的最後?通過圍繞僅處理單個值的HourData使用「包裝器」集合,可以輕鬆避免這種混淆。

+0

謝謝,這是關於HashMaps的一些有趣的觀點。有數組的原因是由於它的大小。可以說,臨時風陣列約有10,000個值。這將需要創建10,000個對象!我認爲這將是太多的開銷呃? – hash

+0

您計劃存儲的價值越多,我對績效的觀點就越有意義。 :)如果你想存儲10,000個值,你最好有一個存儲HourData對象的長度爲10,000的數組。 –

+0

如果所有的數據陣列的大小相同,那麼這將完成這項工作。我認爲很難估計基元數組和對象數組之間的性能差異。數據分配算法太複雜,無法做出精確的估計。無論如何,不​​成熟的優化是所有邪惡的根源,我不認爲額外的對象引用會在這裏造成太多的開銷。考慮靈活性最好。 –

相關問題