【问题标题】:Java Collision in Hashset collectionHashset 集合中的 Java 冲突
【发布时间】:2019-11-19 12:29:23
【问题描述】:

我如何通过 jUnit 测试证明 HashSet 处理了冲突。例如,我可以在 for 循环中用 10000 个元素填充 HashSet,但是哪个参数应该告诉我我有冲突,我想考虑一下集合大小,但不太确定。

【问题讨论】:

  • 你如何定义碰撞?您希望单元测试究竟测试什么?
  • 放入两个相等的项,并断言大小为 1。或者,如果您的意思是 hash 冲突,则放入两个具有相同哈希的不相等项,并断言大小为 2。
  • @AndyTurner 我会回答的。我正要写类似的东西。
  • 哈希码冲突。如果我添加具有相同哈希码的项目,它应该显示,而不是 HashSet 在内部对相同的哈希码进行罚款并处理它,类似这样
  • 你不应该证明这一点。 HashSet 的作者已经这样做了。您应该专注于测试您的代码。

标签: java collections hashset


【解决方案1】:

如果要断言HashSet 处理相等值的冲突,则放入2 个相等的值,然后断言集合中只有一项:

HashSet<String> set = new HashSet<>(Arrays.asList("A", "A"));
assertEquals(1, set.size());

如果您想断言HashSet 处理相等哈希码的冲突,请输入具有相同哈希码的不相等值,然后断言集合中有两项: p>

assertEquals("Aa".hashCode(), "BB".hashCode());
HashSet<String> set = new HashSet<>(Arrays.asList("Aa", "BB"));
assertEquals(2, set.size());

【讨论】:

    【解决方案2】:

    我不明白这个测试的目的是什么,但你可以这样做:

    Set<String> mySet = new HashSet<>();
    int numberOfRandomElements = 10000;
    
    mySet.addAll(createRandomElements(numberOfRandomElements));
    
    int diff = numberOfRandomElements - mySet.size();
    System.out.println(String.format("Number of elements removed: %d", diff));
    

    【讨论】:

    • 谢谢拉斐尔。也许我会问一些愚蠢的问题,但是为什么尺寸会减小?
    • @VovaAdamenko HashSet 使用其 hashCode 存储元素。当我们尝试从另一个已经存在的元素中添加具有相同 hashCode 的元素时,第一个元素会被覆盖。
    • 我说我不明白这个测试的目的,因为:1)正如@Joeblade所说,随机的junit不是一个好主意。这就是为什么我没有在我的回复中做出断言。 2) 你为什么要测试 HashSet 的实现?我确信它已经过很好的测试并且运行良好
    • 其实,我想澄清一下我的问题。我需要统计HashSet中具有相同hashCode的元素个数,看看这个HashSet中可以存在多少碰撞,从而改进hasCode计算机制。像这样的东西。最后我无法理解如何编写这个测试,我的意思是计算相同的 HashCodes
    猜你喜欢
    • 2012-10-06
    • 2017-10-29
    • 2020-03-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多