使用自定义Java对象或使用HashMaps存储数据是否更好?

时间:2011-09-07 03:32:02

标签: java

让我们说我们有一堆数据(温度,风,压力)最终作为一些浮点数组出现。 例如:

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这样的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);

在这两种方法中,在性能,可读性,良好的OOP实践等方面表现更好

5 个答案:

答案 0 :(得分: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个实例的列表。如果您按照描述的方式使用了三个float数组,那么访问第i个tempwindpressure值可能会导致访问三个单独的pages在记忆中。发生这种情况是因为所有temp值都将连续存储,然后是所有wind值,后跟所有pressure值。如果您使用类将这些值组合在一起,那么访问第i个tempwindpressure值会更快,因为它们将全部存储在彼此相邻的位置存储器中。

<强>直观

如果您使用HashMap,则任何需要访问任何字段的人都必须提前知道字段名称。 HashMap个对象更适合于在编译时未知密钥的键/值对。使用包含明确定义字段的HourData类,只需查看类API即可知道HourData包含tempwind和{{1}的值}}

此外,数组字段的getter和setter方法可能会令人困惑。如果我只想在列表中添加一组pressuretempwind值,该怎么办?我是否必须获取每个数组,并将新值添加到它们的末尾?通过在pressure周围使用仅包含单个值的“包装”集合,可以轻松避免这种混淆。

答案 1 :(得分:0)

你提到了一堆数据,所以我宁愿把它读作数据集合。

所以答案是,如果Java集合框架中已有的东西已经开箱即用,你为什么要为你编写一个。

您应该查看Java集合类,看看哪个更适合您的需求,无论是并发访问,快速检索时间还是快速添加时间等等。

希望这有帮助

EDIT ----

再添加一个维度。

您正在构建的应用程序类型也会影响您的方法。

上述讨论正确地提到了可读性,灵活性,性能作为您设计的驾驶标准。

但您正在构建的类型的应用程序也是影响因素之一。

例如,让我们假设您正在构建一个Web应用程序。

长时间存储在内存中的对象可以是应用程序或会话范围。因此,您必须通过设计使其不可变或将其用于线程安全方式。

不同实施中保持相同的业务数据应根据OOP或最佳实践进行设计,但基础架构或应用程序逻辑应更多地是您的框架驱动。

我觉得你在说什么,就像在内存中长时间保存一个对象更像是一个框架驱动的outlook,因此我建议使用Java Collection并将你的业务对象放在其中。重点是

  1. 并发访问控制
  2. 设计不可改变

答案 2 :(得分:0)

为了便于阅读,我肯定会选择一个对象,因为它更有意义。特别是因为您存储了不同的数据集,例如风长度具有与临时长度不同的含义。

除此之外,您还可以存储其他信息,例如测量的位置和时间。

答案 3 :(得分:0)

好吧,如果你没有任何关键来区分同一个对象的不同实例。我会创建HourData对象并将它们存储在数组列表中。

将数据放入包含的对象中总是会增加可读性。

答案 4 :(得分:0)

如果您有一个有限且已经定义的参数列表,那么最好使用第二种方法。

  1. 在性能方面:您不需要在hashmap中搜索密钥
  2. 就可读性而言:data.setTemp(temp)优于map.put("temp", temp)。第一种方法的好处之一是在编译期间会记录输入错误
  3. 在良好的OOP实践方面:第一种方法与OOP实践无关。使用第二种方法,您可以轻松地更改实现,添加新方法,提供多种替代数据对象实现等。
  4. 但是,如果您不知道参数以及是否要使用未分类(可扩展)参数集,则可能需要使用集合。