2012-07-19 61 views
6

我有一个Hashtable其中有一个密钥String和价值String,但我已经达到了我的项目中,我需要能够存储多个不同的数据类型的一个点。例如,我需要将intString,Date等全部存储在一个Hashtable中。有没有办法将多个数据类型存储在单个散列表变量中?

+3

将键改为'Object'? – Mysticial 2012-07-19 19:36:28

+1

使用get/set创建一个对象并添加该对象HashTable/ArrayList(或)什么是您感兴趣的集合是不是很好的选择?如果您添加多个数据类型,而检索如果您不知道确切的索引和数据类型,则最终会出现classcastexception。 – kosa 2012-07-19 19:37:03

+0

这听起来像一个非常脆弱的数据结构。你能描述一下你试图达到的目标么,也许有人可以提出一种更好地构建数据的方法吗? – Bobulous 2012-07-19 20:06:57

回答

7

HashTable或任何收藏Map可以解决这个问题,除了int和其他原始类型:您不能储存基本类型,只有Object引用。需要将int包装为Integer对象。

+0

那么我能否将它作为它存储的数据类型来检索? – samwell 2012-07-19 19:41:45

+2

不是真的,不 - 不是 - 没有演员阵容,它仍然是挑剔的。对于不同的类型,使用不同的地图会更好 - 或者更好 - 只需创建一个带有每个不同名称的字段的类,而不是有一个'Map',您希望您确信一切正确的类型。 – 2012-07-19 19:45:11

4

你可以让它存储一般数据类型Object,虽然那不允许原始数据类型。

0

将您的HashTable更改为Hashtable<String, Object>,并且当您想要存储int时,您需要先将其抛出(或使用自动播种)至Integer。在从表格中获得您的价值后,您可以通过if(value instanceof String)等等来确定您的类型。

+4

没有必要强制转换 - 自动装箱会自动执行(Java 5+)。 – 01es 2012-07-19 19:41:51

+3

该类称为Hashtable,它需要两个类型参数,而不是一个。 – 2012-07-19 19:44:17

6
Map<String, Object> map = new HashMap<String, Object>() 

这给你与String类型的密钥和类型对象,这基本上意味着型对象(日期,整数,字符串等)的任何后代的值的映射图。其他答案正确地指出这样一个事实,即不是使用像int,boolean这样的原语,而是使用它们的对应整数,布尔等。

get在这样的地图上的返回类型操作是Object。因此,开发人员有责任正确处理类型信息。

有关Hashtable和HashMap之间有什么区别的问题的一个很好的答案是here

4

虽然这是可能的,但它通常不是一个好主意。通常这会导致类型转换异常和问题。

HashTable可以设置为存储通用对象而不是特定的类类型,但是检索它们时的类型转换不会自动发生。

为了将对象从集合中取出,必须开发某种形式的类型检查例程。

您最好为要存储的每个类类型创建一个单独的集合。 PS:我也推荐使用HashMap而不是HashTable。 HashTable已被弃用。

+0

谢谢,我不知道。 – samwell 2012-07-19 20:06:32

相关问题