使用单个hashmap与多个变量

时间:2011-10-18 20:37:16

标签: java

假设我们有一个名为CompHash的类,它有30个不同的变量,如下所示:

   public class CompHash{
      private String abc1;
      private int sdf2;
             :
             :
      private float sgh30;
   }

和类似的课程:

     public class CompHash{
         private HashMap diffVariables;
     }

在我需要的变量数量从1到30不等的情况下,哪两个会更好?

4 个答案:

答案 0 :(得分:7)

一般来说,始终更喜欢强类型CompHash(第一个)。它不仅更安全,而且速度也更快。

如果您需要存储任意数量的变量,HashMap 可能是一个不错的选择。但是请记住,你牺牲了类型安全而没有太大的收获 - HashMap可能仍然会占用更多的内存,而不是单个具有大量null s的对象。

HashMap的唯一有效用法是当您需要存储键的任意对(目前尚不清楚变量/键名是否为常量)时 - >值。但是在这种情况下,我建议使用具有共同祖先的类层次结构包装原语,并使用Visitor模式来避免不稳定的向下转换和丑陋的instanceof

是的,你实际解决了什么问题?您需要的数据结构似乎有点异国情调......

答案 1 :(得分:0)

您可能还会考虑List<T>来存储项目列表,因为您不确定可能存在1到30个变量。你可以使用动态数组,即:list。

将对象存储到列表中并不是一个好主意,当您想要使用它时需要进行转换,如果您不知道存储的类型,则会获得强制转换异常。

例如:如果您想存储今天上课的学生的姓名,您可以使用列表。因为你不知道会有多少学生出现,所以你正在使用它的动态性的arraylist原因。

List<String>

这将是您的代码。

我建议你不要将HashMap用于存储数据的商店对象字段,即:properties。

答案 2 :(得分:0)

如果您的变量属性列表是一个已知实体,因为最多只有X个值,并且我知道每个值的类型,那么第一种方法肯定是最有意义的。在那种情况下,正如@Tomasz在他的回答中提到的那样,更可取。您不必担心类型安全问题。

但是,如果您的对象具有一组属性,然后需要具有不同类型和不同数量的其他内容的列表,那么HashMap可能有意义。有一些事情要记住。

首先,尽可能指定类型。例如:

HashMap<String,Object> myHash = new HashMap<String, Object>();

如果以这种方式创建,则您的hashmap键始终需要是一个字符串。如果你正在处理以动态方式命名的事物,这可能是一个很好的方法。你会注意到我只是指定了Object。因此,你可以存储任何对象类型,如果你想存储基元,你需要用它们作为Integer,Double,String等,而不是int,double,string。

然后,像这样构造的压力部分是你需要演员和检查类型并准备好处理它。当您将信息撤回时,您需要执行以下操作:

if myHash.get(key) instanceof Integer
     Integer myVal = (Integer) myHash.get(key);
else if myHash.get(key) instanceof Double
     Double myVal = (Double) myHash.get(key);

然后,您需要在拉出值时检查类型和强制类型,然后根据属性名称和对象类型将它们发送到新的方法/逻辑中。你可以完成这些非常有用的事情......但是如果不把自己画成一个过于复杂的角落就很难做到。特别是当Java's reflection api可用于以更安全的方式动态获取属性时(尽管并非没有它自己的头痛。)

答案 3 :(得分:0)

我喜欢强类型变量的第一个选项。但是如果可能的话,我会强烈考虑将30个属性分组为至少4-5个类。