【问题标题】:Why we use ArrayList when we could have used Set for adding unique values?当我们可以使用 Set 添加唯一值时,为什么还要使用 ArrayList?
【发布时间】:2011-04-27 04:15:38
【问题描述】:

我找到了一个使用以下方法添加唯一项目的有效代码:

int[] values = { -5, -3, -1, 0, 3, 6 };

List<Integer> list=new ArrayList<Integer>();

for(int val : values)

{

   if(!list.contains(val))

   list.add(val);

}

我可以使用 HashSet 而不是 ArrayList 来完成相同的工作。这会帮助我不用担心检查列表中是否已经存在该值。为什么使用 Hashset 不是一种有效的方法?

【问题讨论】:

  • A List 从来没有打算/旨在保持独特的价值,所以我看不出你的问题的重点。如果您想保持独特的价值,请继续使用Set。为此目的使用正确的数据结构。
  • 一个 ArrayList 可以很好地保存唯一值,它只是不能确保唯一性。而且它更适合按位置查找而不是contains(它必须扫描列表)。我们需要更多关于他想要达到的目标的背景信息。

标签: java arrays arraylist set


【解决方案1】:

HashSet 没有实现 List 接口。 Set 中的值没有被索引。我们无法从Set获取值。

因此,如果您只需要存储唯一值,那么您可以安全地使用Set 实现。如果您需要保持插入顺序,或者如果您需要 List 实现的任何其他功能唯一性,请使用您问题中的方法:装饰现有的 List 实现并添加功能以拒绝重复.

您询问效率:ArrayList 由数组支持并且速度非常快。但是contains() 的时间复杂度是 O(n) - 为了进行迭代,我们在最坏的情况下查看了每个元素。

HashSet 或多或少是完整的HashMap 的装饰器,与array 相比要重一些。但是contains 的时间复杂度是 O(1) - 无论地图中有多少项目,检查都是在恒定时间内完成的。

如果你只是想迭代 - 一个专门的 List 实现应该稍微快一些 - 两者的迭代时间复杂度都是 O(n)(不足为奇),但是从数组中读取比从 Map 中读取更容易.

【讨论】:

  • 非常感谢你这么可爱的回答。非常感谢其他朋友也付出了他们的时间。我想我应该阅读更多关于计算循环时间复杂度的内容。 @再次感谢大家。问候,克里希纳
【解决方案2】:

实际上,HashSet 是比ArrayList 更好的方法很多HashSet 的代码运行时间为 O(n),ArrayList 的运行时间为 O(n²)。

但是,要记住一件事:HashSet 中的元素没有按任何特定顺序保存。如果您想保持订单快速查找,请使用LinkedHashSet。 (不过,一切都是有代价的;在这种情况下,LinkedHashSet 使用的内存比 HashSet 多。)

【讨论】:

  • 但是,至少在示例中n 非常小。无论如何,这些元素是不同的。当他可以使用原始数组时,为什么要使用列表?没有更多的上下文,在这里很难给出建议。
  • @Thilo:没错,需要更多的上下文。
  • 感谢您的建议。我想计算数组中的唯一值。我想将 uniuqe 值添加到 elist 中,然后获取列表的大小以获取唯一值的计数。但是现在在阅读了您的答案后,我觉得我应该使用 HashSet 然后将值添加到其中,然后获取大小。谢谢:)
【解决方案3】:

是的。你的问题的前提是有缺陷的。

使用guava 更简单:

Set set = Sets.newTreeSet( values ); //或哈希集

【讨论】:

  • 如果你使用 Guava,我更愿意使用 ImmutableSet.of(-5, -3, -1, 0, 3, 6)。不变性 FTW。 :-)
  • 大声笑,很公平。我假设 values 实际上没有定义,否则 Arrays.asList() 可能已经构建了 arraylist,并且不需要检查重复项。 ;)
  • 好的。怎么样:ImmutableSet.copyOf(values)。仍然是一个集合,仍然是不可变的。 :-)
  • 谁说数据是不可变的? :P 10:1 来自示例源的任何代码都会添加值,重新分配列表引用,并具有多个返回点。 jk。是的,ImmutableSet.of 是另一种选择。
猜你喜欢
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多