我注意到将一个元素添加到列表中确实会更改其散列键值,因此无法再次访问它,因为 .contains(modifiedObject)
不会在此处发生冲突。我没想到那个行为是诚实的。让我想知道 HashSet
是如何进行哈希处理的。那么我如何确保不在我修改时销毁我的 HashSet
,例如如下所示的字符串列表。有没有一种方法可以安全地做到这一点,或者这只是我作为程序员必须注意的事情?
private HashSet<List<String>> bagOfWordsMap = new HashSet<List<String>>();
private void createBagOfWordsList(UnifiedTag[] invalidTags) {
for(List<String> sentences : getSentenceList()) {
List<String> sentenceStemWords = new ArrayList<String>();
// Not what you would want to do since sentenceStemWords is
// modified right after and bagOfWordsMap.contains(sentenceStemWords)
// won't collide again:
// bagOfWordsMap.add(sentenceStemWords);
for(String word : sentences) {
String stem = Stemmer.getStem(word);
sentenceStemWords.add(stem);
}
bagOfWordsMap.add(sentenceStemWords);
}
}
最佳答案
切勿将可变对象用作映射或集合中的键
如果你想防止意外修改,实现一个不能被修改的卡住类型!
- 细则:从技术上讲,如果对象不更改键,则在对象上具有可变属性是可以的,但是您将无法通过 java 集中的键轻松访问它们,因为没有
HashSet.get
获取当前成员,只有一个包含
。此外,它的风格很差而且很脆弱。最好将此类对象拆分为键、值。
关于java - 如何避免意外的哈希键操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29047669/