在ArrayList上使用HashSet来传达意图?

Bry*_*ryB 10 java collections arraylist set

想象一下,我需要创建一个元素集合,其中顺序可能或不重要.实际上,我计划做的就是使用迭代器.我注意到我的大多数同事使用ArrayList和LinkedHashSet/HashSet.我的问题是,如果我知道这些元素应该是唯一的,我应该使用Set还是List?实际上它并没有真正有所作为,但没有更有效地表达元素是独特的?

我发现这对于大型企业应用程序来说是一个有趣的问题,原因如下:1)如果你不能保证整体代码的质量,使用Set可能很危险.为什么?因为equals()和hashcode可能被错误地覆盖,因此使用Set可能会导致一些非常讨厌的问题.2)使用List对未来的更改更具弹性.如果出于某种原因重复,则无需担心.

从本质上讲,它归结为:如果我知道我应该期待独特的元素,我是否应该支持所有情况下的Set over List?

编辑:我想我也问:Set是否应该用于确保不添加重复项,或者它是否也可以用于说明不存在重复项以便于理解?

phi*_*hag 7

1)完全是虚假的.不要解决bug,修复它们.因此,使用任何设置实现,如果顺序并不重要,或者SortedSet的,如果为了事情.如果元素不必是唯一的(并且您现在应该确定它,并且它通常不应该更改),请随意使用List.


Fra*_*ois 0

如果更可取,请进行设置,因为它将强制执行唯一性并显示错误所在。

当方法被错误地重写时,您可能会遇到一些问题,但正确的选择是不祈祷并避免调用它们。检测错误并修复它们!

编辑:是的,当您看到一个集合时,会更清楚,需要唯一值,甚至更好:强制执行唯一值。永远不要猜测/相信你的代码的用法;)