Sid*_*ani 1 java hashtable hashset
问题实际上是关于在集合中动态变化的对象."包含"方法是每次都单独比较每个对象还是做一些聪明的事情?
如果你在一个集合中有10000个条目,我会期望它更聪明地工作但不确定.或者如果没有,有没有办法通过添加一个钩子来优化它,该钩子会告诉集合对象更新已经改变的对象的哈希码?
附加问题:
感谢下面的答案......我还可以问一下ArrayList会发生什么吗?我在文档中找不到任何说明不在ArrayList中放置可变对象的内容.这是否意味着搜索算法只是去比较每个对象的哈希码?
它们散列对象并通过其哈希码查找它.如果它在那里,它将比较对象本身.这是因为具有相同散列的两个或多个对象可能不是同一个对象.
由于Java的哈希集合使用存储桶(链接),因此它们必须查看存储桶中的所有对象.这些对象保存在链接列表中(不是java.util.LinkedList,而是自定义列表)
这通常非常有效,并且该HashSet.contains()方法是摊销的 O(1)(恒定时间).
Java的文档可以回答你问题的第二部分:
注意:如果将可变对象用作set元素,则必须非常小心.如果在对象是集合中的元素的同时以影响等于比较的方式更改对象的值,则不指定集合的行为.这种禁令的一个特例是,不允许集合将自身作为一个要素包含在内.