为什么java.util.Set<V>接口不提供get(Object o)方法?[已关闭]

2022-09-01 00:38:52

我知道在Set中只允许根据.equals()的任何对象的一个实例,并且如果您已经有一个等效对象,则不应该“需要”从Set中获取对象,但我仍然希望有一个.get()方法,该方法在给定等效对象作为参数的情况下返回Set中对象的实际实例(或null)。

关于为什么它被设计成这样的任何想法/理论?

我通常必须通过使用Map并使密钥和值相同或类似的东西来解决这个问题。

编辑:我认为到目前为止人们还不理解我的问题。我想要的集合中已经存在的确切对象实例,而不是.equals()返回true的可能不同的对象实例。

至于为什么我想要这种行为,通常.equals()不考虑对象的所有属性。我想提供一些虚拟查找对象,并在Set中获取实际的对象实例。


答案 1

虽然纯度论证确实使该方法令人怀疑,但潜在的意图并没有实际意义。get(Object)

有各种类和接口系列稍微重新定义了 。只需查看集合接口即可。例如,ArrayList和LinkedList可以相等;它们各自的内容只需要相同且顺序相同。equals(Object)

因此,有很好的理由在集合中找到匹配的元素。也许更清楚地表明意图的方法是有一个像这样的方法

public interface Collection<E> extends ... {
  ...
  public E findMatch(Object o) throws UnsupportedOperationException;
  ...
}

请注意,此 API 具有比 Set 中更广泛的值。

至于问题本身,我没有任何理论来解释为什么省略这样的操作。我会说最小跨度集参数不成立,因为集合 API 中定义的许多操作都是出于便利性和效率的动机。


答案 2

问题是:Set不是为了“获取”对象,而是为了添加和测试存在。我明白你在找什么,我有类似的情况,最后在键和值中使用了同一对象的地图。

编辑:只是为了澄清:http://en.wikipedia.org/wiki/Set_(abstract_data_type)