Java 使用单个hashmap与多个变量
假设我们有一个名为CompHash的类,包含30个不同的变量,如下所示:Java 使用单个hashmap与多个变量,java,Java,假设我们有一个名为CompHash的类,包含30个不同的变量,如下所示: public class CompHash{ private String abc1; private int sdf2; : : private float sgh30; } 和一个类似的类别: public class CompHash{ private HashMap diffVariab
public class CompHash{
private String abc1;
private int sdf2;
:
:
private float sgh30;
}
和一个类似的类别:
public class CompHash{
private HashMap diffVariables;
}
在我需要的变量数量从1到30不等的情况下,两个变量中哪一个更好 通常,您应该始终首选强类型
CompHash
(第一个)。它不仅更安全,而且速度也将大大加快
如果您需要存储任意数量的变量,HashMap
可能是一个不错的选择。但是请记住,您正在牺牲类型安全性而没有获得太多好处-HashMap
可能仍然会占用更多内存,而不是一个包含大量null
s的对象
HashMap
的唯一有效用法是需要存储key->value的任意对(不清楚变量/键名在您的情况下是否为常量)。但是在这个场景中,我建议使用具有共同祖先的类层次结构包装原语,并使用Visitor
模式来避免危险的向下转换和丑陋的实例
顺便问一下,你到底在解决什么问题?您需要的数据结构看起来有点异乎寻常…… 您也可以考虑<代码>列表>代码>来存储项目列表,因为您不确定可能有1到30个变量。您可以使用动态数组,即:list
将对象存储到列表中不是一个很好的主意,当您想要使用时需要强制转换,如果您不知道存储的类型,您将得到强制转换异常
例如:如果要存储今天上课的学生的姓名,可以使用列表。因为你不知道会有多少学生出现,所以你使用arraylist是因为它是动态的
List<String>
列表
这将是您的代码
我不建议您对存储数据的存储对象字段使用HashMap,即:properties。如果您的属性变量列表是一个已知的实体,如中所示,最多有X个值,并且我知道每个值的类型,那么第一种方法肯定最有意义。在这种情况下,正如@Tomasz在他的回答中提到的那样,这是更好的选择。你不必太担心类型安全
但是,如果您的对象有一组属性,然后需要有一个不同类型和不同数量的其他内容的列表,那么HashMap可能是有意义的。有一些事情需要记住
首先,尽可能地指定类型。例如:
HashMap<String,Object> myHash = new HashMap<String, Object>();
然后,您需要在提取值时检查类型和强制转换,然后根据属性名和对象类型将它们发送到新的方法/逻辑中。像这样,你确实可以完成一些有用的事情……但是如果不把自己画进一个过于复杂的角落,你就很难做到这一点。特别是当可以使用它以更安全的方式动态获取属性时(尽管它本身也很麻烦)。我喜欢第一个带有强类型变量的选项。但是,如果可能的话,我会强烈考虑将这30个属性分组为至少4-5个类。你能澄清更多吗?如何将变量存储到hashmap?它应该是通用的?您的问题不清楚。diffVariables.put(“abc1”,新字符串(“hello”);那些命名隐晦的变量是什么?通常在OO语言中,类名和属性名都有意义,并且不会出现您所描述的情况。你只想知道什么需要更少的存储空间,什么运行得更快?然后你打算如何在另一个类中使用这些变量?顺便说一句,不要使用新字符串(“hello”)
,“hello”
就够了。但是,如果所需的变量太多,并且只有一小部分经常被使用,那该怎么办呢?我只是想找到一种更好的方法来处理在大部分时间有很多变量未使用时出现的问题。尝试将对象大小保持为所需的小。他可能需要类型安全的异构容器。:)如果你有一个包含大量变量的类,并且其中有很多是未使用的,你可能需要重新设计你的类。如果键空间很大,但已知且有限,大多数时候我会选择字段。当然,如果密钥空间非常大或在运行前未知(例如,一个表示法语名称出现的类),Map
将是一个更好的主意。一个只有几十个字段(更不用说几百个或几千个字段)且只有几个字段不为null的类是一场灾难。经验法则:如果您达到64K类大小限制,请选择Map
;-)。再想想你的问题,我想你应该用不同的方式来建模这个域。你是说用对象类型来使用列表?
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);