搜索算法如何处理java集合(如HashSet)中的对象?

搜索算法如何处理java集合(如HashSet)中的对象?,java,hashtable,hashset,Java,Hashtable,Hashset,问题实际上是关于集合中动态变化的对象。“contains”方法是每次单独比较每个对象还是做了一些聪明的事情 如果你在一个集合中有10000个条目,我希望它能更聪明一些,但不确定。或者,如果没有,是否有一种方法可以通过添加一个钩子来优化它,该钩子可以告诉集合对象更新已更改对象的哈希代码 补充问题: 感谢下面的答案。。。我可以问一下ArrayList的情况吗?我在文档中找不到任何说明不要将可变对象放入ArrayList的内容。这是否意味着搜索算法只是简单地与每个对象的哈希代码进行比较???他们对对象

问题实际上是关于集合中动态变化的对象。“contains”方法是每次单独比较每个对象还是做了一些聪明的事情

如果你在一个集合中有10000个条目,我希望它能更聪明一些,但不确定。或者,如果没有,是否有一种方法可以通过添加一个钩子来优化它,该钩子可以告诉集合对象更新已更改对象的哈希代码

补充问题:


感谢下面的答案。。。我可以问一下ArrayList的情况吗?我在文档中找不到任何说明不要将可变对象放入ArrayList的内容。这是否意味着搜索算法只是简单地与每个对象的哈希代码进行比较???

他们对对象进行哈希运算,并根据其哈希代码进行查找。如果存在,它将比较对象本身。这是因为具有相同哈希的两个或多个对象可能不是同一个对象

因为Java的散列集合使用bucket(链接),所以它们必须查看bucket中的所有对象。这些对象保存在链接列表中(不是
java.util.LinkedList
,而是一个自定义列表)

这通常非常有效,
HashSet.contains()
方法是O(1)(常数时间)


请回答问题的第二部分:

注意:如果将可变对象用作集合元素,则必须非常小心当对象是集合中的一个元素时,如果对象的值以影响相等比较的方式更改,则不指定集合的行为。这种禁止的一种特殊情况是,不允许集合本身包含为元素


他们对对象进行散列,并根据其散列代码进行查找。如果存在,它将比较对象本身。这是因为具有相同哈希的两个或多个对象可能不是同一个对象

因为Java的散列集合使用bucket(链接),所以它们必须查看bucket中的所有对象。这些对象保存在链接列表中(不是
java.util.LinkedList
,而是一个自定义列表)

这通常非常有效,
HashSet.contains()
方法是O(1)(常数时间)


请回答问题的第二部分:

注意:如果将可变对象用作集合元素,则必须非常小心当对象是集合中的一个元素时,如果对象的值以影响相等比较的方式更改,则不指定集合的行为。这种禁止的一种特殊情况是,不允许集合本身包含为元素


当元素添加到集合中时,
HashSet
计算元素的长度。它以一种非常有效的方式来存储它,以查找具有相同哈希代码的所有元素

然后,当您调用
contains()
时,它只需计算您要查找的值的哈希代码,并找到集合中具有相同哈希代码的所有元素。可能有多个元素,因为散列码不是唯一的,但具有匹配散列码的元素可能远少于集合本身中的元素。然后使用
equals
检查每个匹配元素,直到找到匹配项或候选项用尽为止


编辑:为了回答第二部分,我在第一次阅读时不知怎么错过了,您将无法再次找到该元素。不能以任何影响相等的方式更改哈希表中用作键的元素或哈希集中的元素,否则基本上会破坏内容。

a
HashSet
在将元素添加到集合中时计算元素的大小。它以一种非常有效的方式来存储它,以查找具有相同哈希代码的所有元素

然后,当您调用
contains()
时,它只需计算您要查找的值的哈希代码,并找到集合中具有相同哈希代码的所有元素。可能有多个元素,因为散列码不是唯一的,但具有匹配散列码的元素可能远少于集合本身中的元素。然后使用
equals
检查每个匹配元素,直到找到匹配项或候选项用尽为止


编辑:为了回答第二部分,我在第一次阅读时不知怎么错过了,您将无法再次找到该元素。您不能以任何影响相等的方式更改哈希表中用作键的元素或哈希集中的元素,否则基本上会破坏内容。

a
HashSet
在引擎盖下使用
HashMap
。因此,
contains
操作使用对象中的
hashCode()
方法来检查它是否存在于由
HashMap
实现的哈希表中A
HashSet
在引擎盖下使用
HashMap
。因此,
contains
操作使用对象中的
hashCode()
方法来检查它是否存在于由
HashMap
实现的哈希表中。简单的答案是-no,没有发生任何事情。如果您希望对象的状态以影响其
hashCode()
等于(…)
行为的方式更改,则不得将其存储在
HashSet
或任何其他
集中。引自:

注意:如果将可变对象用作集合元素,则必须非常小心。当对象是集合中的一个元素时,如果对象的值以影响
等于
比较的方式更改,则不指定集合的行为。这种禁止的一种特殊情况是,不允许集合本身包含为元素


答案很简单——不,没有聪明的事情发生。如果你期望一个对象的