2014-09-05 40 views
1

我想操作整个数组,我可以使用hashtable解决问题。我想将数组的元素存储为Key,但是对于Value我真的不在乎会在那里存储什么。在这种情况下,我应该如何创建我的散列表?我的做法是就为了这样的每个元素设定值设为0:当我不关心Value中存储的内容时,我应该如何创建Hashtable <Key, Value>?

Hashtable<Integer, Integer> ht = new Hashtable<Integer, Integer>(); 
    for (int i = 0; i < arr.length; i++) { 
     ht.put(arr[i], 0); 
    } 

有什么约定我应该在这种情况下怎么办?例如,为所有插入的元素设置ValueBoolean还是分别为true更好?再一次,对我来说,Value中存储的内容并不重要。我只想知道在这种情况下什么是最好的方法。

+0

“我想整数数组工作,并且我可以使用哈希表解决问题” - ** wut?**问题:你为什么不只是使用数组? ('Integer [] arr = new Integer [capacity];') – Vogel612 2014-09-05 09:35:24

+6

如果你只需要键而不是值,那么你使用的是错误的数据结构。你需要一个Set而不是一个Hashtable。 – janos 2014-09-05 09:55:57

+0

如果你不担心值,那么使用'HashSet'可以存储对象 – 2014-09-05 10:00:01

回答

2

正如rolfl指出的那样,Hashtable是一个数据结构,在Collections Framework被引入之前已经存在。它可能可能被视为替代Collections.synchronizedMap,但后者给予一些额外的灵活性。

所以一般建议可以到在新的代码中使用Hashtable,因为有更好的选择了。


最重要的,不管你是否使用Hashtable与否:你不应该知道你正在使用它。特别是,你应该永远声明您的变量是一个Hashtable,但始终是一个Map

// Don't do this! 
Hashtable<Integer, Integer> ht = new Hashtable<Integer, Integer>(); 

// Do this instead (if you don't need synchronized access) 
Map<Integer, Integer> ht = new HashMap<Integer, Integer>(); 

// Or this, if you need synchronized access: 
Map<Integer, Integer> ht = 
    Collections.synchronizedMap(new HashMap<Integer, Integer>()); 

另见What does it mean to “program to an interface”?


话虽这么说,好像你不完全需要MapHashtable。从描述中,这听起来像你只是想知道某个特定的键是否包含在地图中。这可能建模以不同的方式。但最有可能的,这意味着你应该使用Set代替Map

Set<Integer> set = new HashSet<Integer>(); 
for (int i = 0; i < arr.length; i++) { 
    set.add(arr[i]); 
} 

// To check whether an integer is contained in the set: 
if (set.contains(42)) { 
    ... 
} 
1

`散列表是一个可怕的数据结构使用,即使你想存储一个真正的价值。您应该使用HashMap而不是Hashtable,除非您确切知道Hashtable为什么适合您的情况。

Hashtable是一个同步类,它不允许空值,并且通常比Hashmap更慢和可用性更低。

所以,从不使用Hashtable时,HashMap会做。

无论如何,对于您的用例,您可能想要成为using a HashSet,并将值存储在那里。这会给你你想要的。