从集合中获取元素

为什么Set不提供一个操作来获取与另一个元素相等的元素

设置<Foo>集合=。。。;
...
Foo-Foo=新的Foo(1,2,3);
Foo-bar=set.get(Foo);//从等于Foo的集合中获取Foo元素

我可以询问集合是否包含一个等于的元素,为什么我不能获取该元素(

澄清一下,equals方法被重写,但它只检查其中一个字段,而不是所有字段。因此,两个被认为相等的Foo对象实际上可以有不同的值,这就是为什么我不能只使用Foo

要回答一个精确的问题“为什么不设置提供一个操作来获得一个与另一个元素相等的元素?”,答案是:因为集合框架的设计者不是很有前瞻性。他们没有预见到您非常合理的用例,只是天真地尝试了“为数学集合抽象建模”(来自javadoc),只是忘记添加有用的get()方法

现在,我们来看一个隐含的问题“如何获得元素呢?”:我认为最好的解决方案是使用映射<E,E>而不是集<E>,将元素映射到它们自己。这样,您就可以高效地从“集合”中检索元素,因为get()Map的方法将使用有效的哈希表或树算法查找元素。如果需要,您可以编写自己的Set实现,该实现提供额外的get()方法,封装Map

以下答案在我看来是坏的或错误的:

“您不需要获取元素,因为您已经有了一个相等的对象“:如您在问题中所示,断言是错误的。相等的两个对象仍然可以具有与对象相等性无关的不同状态。目标是访问集中包含的元素的此状态,而不是用作“查询”的对象的状态。”

“您别无选择,只能使用迭代器”:这是对集合的线性搜索,对于大型集合来说效率非常低(讽刺的是,在内部,集合被组织为可以高效查询的哈希映射或树)。不要这样做!我已经看到使用这种方法在现实系统中会出现严重的性能问题。在我看来,缺少get()方法的可怕之处并不在于解决它有点麻烦,而是大多数程序员会使用线性搜索方法而不考虑其影响

发表评论