当我们可以使用 Set 来添加唯一值时,为什么还要使用 ArrayList?

发布于 2024-11-03 16:27:34 字数 316 浏览 2 评论 0原文

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

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 完成相同的工作。这会帮助我不用担心检查该值是否已存在于列表中。为什么使用哈希集不是一种有效的方法?

I found an efficient code for adding unique items using the below approach:

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);

}

I could have done the same work using a HashSet instead of using an ArrayList. That would have helped me by not worring to check if the value already existed in the list. Why is using a Hashset not an efficient approach?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

老街孤人 2024-11-10 16:27:34

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

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

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

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

如果你只是想迭代 - 一个专门的 List 实现应该稍微快一些 - 迭代的时间复杂度都是 O(n) (毫不奇怪),但是从数组读取比从数组读取更容易一张地图。

A HashSet does not implement the List interface. And the values in a Set are not indexed. We can't get value from a Set.

So if you just need a storage for unique values, then you can safely use a Set implementation. If you need to keep insertion order or if you need any other functionality of List implementations and uniqueness, then use the method from your question: decorate an existing List implementation and add functionality to reject duplicates.

You asked about efficiency: ArrayList is backed by an array and pretty fast. But the time complexity for contains() is O(n) - to iterate we have look at each and every element in worst case.

HashSet is more or less a decorator of a full blown HashMap, somewhat heavier compared to an array. But the time complexity for contains is O(1) - the check is done in constant time, regardless how many items are inside the map.

If you just want to iterate - a specialized List implementation should be slightly faster - both have a time complexity of O(n) for the iteration (no surprise) but reading from an array is easier then reading from a Map.

樱&纷飞 2024-11-10 16:27:34

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

但是,需要记住一件事:HashSet 中的元素不按任何特定顺序保存。如果您想保持顺序快速查找,请使用LinkedHashSet。 (不过,一切都是有代价的;在本例中,LinkedHashSetHashSet 使用更多的内存。)

Actually, HashSet is a much better approach than ArrayList. Your code runs in O(n) for HashSet, and O(n²) for ArrayList.

But, one thing to keep in mind: elements in HashSet are not kept in any particular order. If you want to keep order and have fast lookups, use LinkedHashSet. (Everything has a cost, though; in this case, LinkedHashSet uses more memory than HashSet.)

可遇━不可求 2024-11-10 16:27:34

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

使用 guava 会更简单:

Set set = Sets.newTreeSet(values) ; //或者HashSet

It is. The premise to your question is flawed.

Use guava and it's easier:

Set set = Sets.newTreeSet( values ); //or HashSet

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文