java中的集合 - 如何选择合适的集合

时间:2015-03-08 14:48:43

标签: java

我正在学习收藏并试图确定最适合我的练习练习......我已经对它们进行了很多阅读,但仍然无法找到最好的方法...... ..这听起来有点毛茸茸,但任何指导都会受到赞赏....

我需要将旅行者列表与登机牌列表相关联。这两个类都包含一个可变的布尔字段,它将在我的程序中被修改,否则所有其他字段都是不可变的。该布尔字段必须存在。我需要创建一个由10名旅行者组成的集合,然后在满足所有条件时,实例化登机牌并将其与之关联。

由于每个对象都有一个与之关联的唯一引用变量(通过对象工厂创建),因此不会有任何重复。

从做一些阅读我明白,集合必须包含不可变对象,并且不允许重复元素,而列表则相反。

因为我需要将它们相互关联,所以我在考虑一个地图,但我现在知道这些密钥存储在一个集合中,由于上述原因这会产生问题....

我可以覆盖hashcode()方法,以便不考虑布尔字段,因此只要我的所有其他字段都是不可变的,它应该没问题吗?或者那是不好的做法?

我还想过创建一个旅行者列表,然后尝试以另一种方式关联登机牌,但却想不出如何实现这个目标......

请不要给我任何代码 - 只是在正确的方向上某种引导会非常有帮助。

2 个答案:

答案 0 :(得分:0)

如果您正在寻找最佳实践,您需要考虑您现在和将来(近期)的数据计划。当你知道的时候 这是什么,你需要检查哪种方法(列表,集合和地图)最适合你。如果您想比较三者,请查看here

答案 1 :(得分:0)

您已经误导了集成员和地图密钥的可变性要求。

HashMap中进行查找时,您可以根据密钥hashCode进行查找。如果你有可变对象作为键,并改变对象会修改hashCode,那么这就是一个问题。

如果某个密钥在hashCode 123 hashCode时已插入表中,但稍后会将其修改为345 123,由于它存储在hashCode存储桶中,您以后无法再次找到它。

如果可变布尔字段不影响您的hashCode值(例如,您没有覆盖关键类的equalsIdentityHashMap),那么'没问题。

那就是说,既然你说你每个乘客只有一个独特的实例,鲍里斯在关于使用IdentityHashMap的评论中的建议可能是要走的路。 HashMap提供与hashCode相同的行为,其密钥全部使用equalsequals的默认(基于身份)实现。这样,无论您是否为了其他目的而覆盖hashCode和/或{{1}},您都会获得预期的行为。

(请注意,您需要考虑相等性以及hashCode。)