如何避免意外的哈希键操纵

斯蒂芬·福克

我注意到将元素添加到列表中确实会更改其哈希键值,因此无法再次访问它,因为.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);           
    }
}
有QUIT--Anony-Mousse

切勿将可变对象用作地图或集合中的键

实施冻结的类型不能修改,如果你要防止修改的意外!

  • 精美的字样:如果对象不更改键,则在对象上具有可变属性在技术上是可以的,但是您将无法通过Java集中的键轻松访问它们,因为无法HashSet.get获取当前成员,只有一个contains另外,它的风格很差而且很脆弱。最好将此类对象分解为关键值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章