假设我们有一个名为CompHash的类,它有30个不同的变量,如下所示:
public class CompHash{
private String abc1;
private int sdf2;
:
:
private float sgh30;
}
和类似的课程:
public class CompHash{
private HashMap diffVariables;
}
在我需要的变量数量从1到30不等的情况下,哪两个会更好?
答案 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个类。