java - 如何避免意外的哈希键操作

标签 java hash

我注意到将一个元素添加到列表中确实会更改其散列键值,因此无法再次访问它,因为 .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/

相关文章:

java - 通过不同的java线程从同一个数据库表中读取不同的数据集

multithreading - 在 Perl 中使用共享哈希

c++ - 如何散列大于 16kB 的文本文件?

perl - 在保留顺序的同时按值长度对哈希进行排序

security - 我可以用它自己组合多少次 md5 函数?

java - 如何将 ViewPager OnTouchListener 与 ImageView 一起使用,其中也有 OnClickListener

java - 网络代码有时会抛出 UnknownHostException

java - 如何从 Volley 请求响应中解析大型 JsonArray

迄今为止的 Java 字符串

ruby - 将复杂哈希作为参数传递