【发布时间】:2016-01-10 23:50:14
【问题描述】:
我正在学习使用集合。我的问题是:集合不包含重复项。当我们尝试插入重复项时,它不会抛出任何错误并自动删除重复项。在插入集合之前检查每个值是否存在是一种好习惯吗?还是可以执行以下代码之类的操作?我认为 Java 会在内部使用 .contains(value) 进行检查。你怎么看?
考虑到集合中有 n 个元素,这两种情况下的 Big O 复杂度是多少?
import java.util.HashSet;
import java.util.Set;
public class DuplicateTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Integer> mySet = new HashSet<Integer>();
mySet.add(10);
mySet.add(20);
mySet.add(30);
mySet.add(40);
mySet.add(50);
mySet.add(50);
mySet.add(50);
mySet.add(50);
mySet.add(50);
mySet.add(50);
System.out.println("Contents of the Hash Set :"+mySet);
}
}
【问题讨论】:
-
因为
HashSet得到HashMap的支持,您的答案可以在这里找到:stackoverflow.com/a/4553642/4490686 -
它不会执行
contains,而是不会添加已经存在的元素,即它不会增加任何开销来执行此操作。 -
仅供参考,您无法通过添加另一个与已应用的操作具有相同复杂性的操作来更改 Big Oh 复杂性。我的意思是,
for(int x: set) { set.add(x); }和for(int x:set) { set.contains(x); set.add(x); }具有相同的 Big Oh 复杂度,只要add和contains具有相同的复杂度。因为 O(C*n) == O(n),对于任何常数 C。 -
这取决于你想用你的集合做什么。你想知道如果某事。是重复的,那么这样的检查是必要的,如果你只想删除双连,那么这个集合已经做了你想要的一切。
-
@Aron_dc: 因为
add返回一个boolean告诉您该元素是否已添加或重复,所以在添加之前从不任何理由进行检查。
标签: java performance set big-o