区别在于速度。两种方法都有效,但哈希表速度很快。
当您使用ArrayList
或任何类型的List
来查找元素时,您必须逐个检查每个列表项,直到找到所需的单词。如果该词不存在,则您已遍历整个列表。
当您使用 aHashTable
时,您会对正在查找的单词执行一些“魔术”,即计算单词的哈希值。使用该哈希值,而不是遍历值列表,您可以立即推断在哪里找到您的单词 - 或者,如果您的单词在哈希中不存在,那么您的单词不存在。
我在这里过于简单化了,但这是一般的想法。您可以在此处找到另一个问题,其中包含有关哈希表如何工作的各种解释。
这是一个使用HashMap
.
// We will map our words to their definitions; word is the key, definition is the value
Map<String, String> dictionary = new HashMap<String, String>();
map.put("hello","A common salutation");
map.put("chicken","A delightful vessel for protein");
// Later ...
map.get("chicken"); // Returns "A delightful vessel for protein";
您描述的问题要求您使用 aHashMap
作为满足三个要求的字典的基础:
- 将单词添加到字典中
- 从字典中删除一个词
- 检查一个单词是否在字典中
使用存储键和值的映射似乎违反直觉,因为您真正想要的只是存储一个键(或只是一个值)。但是,如上所述,aHashMap
可以非常快速地找到与键关联的值。同样,它可以非常快速地查看是否HashMap
知道密钥。我们可以通过将每个字典单词作为键存储在 中来利用这种质量,并将HashMap
其与垃圾值相关联(因为我们不关心它),例如null
.
您可以看到如何满足这三个要求,如下所示。
Map<String, Object> map = new HashMap<String, Object>();
// Add a word
map.put('word', null);
// Remove a word
map.remove('word');
// Check for the presence of a word
map.containsKey('word');
我不想让信息过多,但我们这里的要求与称为Set
. 在 Java 中,常用Set
的是 . HashSet
,这几乎正是您在这部分家庭作业中实现的。(事实上,如果这不是明确指示您使用 a 的家庭作业HashMap
,我建议您改用 a HashSet
。)