Java 在插入集合之前是否应检查副本

Java 在插入集合之前是否应检查副本,java,performance,set,big-o,Java,Performance,Set,Big O,我正在学习使用电视机。我的问题是:集合不包含重复项。当我们尝试插入重复项时,它不会抛出任何错误并自动删除重复项。在插入集合之前检查每个值是否存在是一种好的做法吗?还是可以执行下面的代码?我认为Java将在内部使用.contains(value)进行检查。你觉得怎么样 考虑到集合中有n个元素,在这两种情况下,最大的O复杂性是什么 import java.util.HashSet; import java.util.Set; public class DuplicateTest { pu

我正在学习使用电视机。我的问题是:集合不包含重复项。当我们尝试插入重复项时,它不会抛出任何错误并自动删除重复项。在插入集合之前检查每个值是否存在是一种好的做法吗?还是可以执行下面的代码?我认为Java将在内部使用
.contains(value)
进行检查。你觉得怎么样

考虑到集合中有n个元素,在这两种情况下,最大的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);
    }

}
import java.util.HashSet;
导入java.util.Set;
公共类重复测试{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
Set mySet=newhashset();
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(“哈希集的内容:“+mySet”);
}
}

可以不检查。这是与列表集相比的主要优势,因为它们将自动过滤掉重复项

HashSet具有固定时间性能()

假定散列函数将元素正确地分散在存储桶中,则此类为基本操作(添加、删除、包含和大小)提供恒定的时间性能

根据:

public boolean add(E)

如果指定的元素尚未存在,则将其添加到此集合。更正式地说,如果此集合不包含元素e2,则将指定的元素e添加到此集合,从而(e==null?e2==null:e.equals(e2))。如果此集合已经包含元素,则调用将保持集合不变并返回false

因此,
add()
方法已经返回true或false。因此,您无需进行额外检查。

add
方法检查元素是否已在
集中。如果该元素已经存在,则不会添加新元素,并且
集合
保持不变。在大多数情况下,你不需要检查任何东西


方法的复杂性取决于您正在使用的集合的具体实现。

add函数返回一个布尔值,您可以检查该布尔值以确定该项是否已在集合中。这当然是基于您的需求,不是最佳实践。很高兴知道,它不会删除已经存在的项,因此,如果您基于数据库中的代理项键定义equals,则不能依赖它使用新信息更新现有值。这与“地图”的工作方式相反,因为“地图”将返回任何现有值并替换为新值。

以下是对您的问题的回答:

当我们尝试插入重复项时,它不会抛出任何错误和错误 自动删除重复项

你的理解不正确。调用
Set.add()
不会添加新项目(如果该项目已在集合中);此语句适用于
Set
的所有实现,包括
HashSet
TreeSet

在插入集合之前检查每个值是否是一种好的做法 它是否存在?还是可以像下面这样做 密码?我认为java将在内部使用 .包含(值)。你觉得怎么样

因为您的理解从一开始就不正确,所以在插入到集合中之前不需要检查每个值,以查看它是否已经存在。是的,它在内部执行类似于
contains()
的操作

在这两种情况下,最大的Oh复杂性是什么 集合中有“n”个元素

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,每个
add()
的时间复杂度都是
O(1)
。对于未使用的
TreeSet()
,每个
add()

的时间复杂度都是
O(lg N)
,因为
HashSet
HashMap
支持,所以您可以在这里找到答案:它不做
包含的
而是不添加已经存在的元素,也就是说,这样做不会增加任何开销。仅供参考,您不能通过添加与已应用的操作具有相同复杂性的另一个操作来改变较大的Oh复杂性。我的意思是,(intx:set){set.add(x);}
和(intx:set){set.contains(x);set.add(x);}
具有相同的大Oh复杂性,只要
add
contains
具有相同的复杂性。因为O(C*n)=O(n),对于任何常数C,这取决于你想对你的集合做什么。你想知道某事物是否重复,那么这样的检查是必要的,如果你只想删除Doubletes,那么集合已经做了你想做的一切。@Aron\u dc:since
add
返回一个
boolean
告诉你该元素是被添加的还是重复的,在添加之前,没有任何理由进行检查。@YassinHajaj-已链接到APIi并提供了相关部分。如果哈希算法不是最优的,则哈希集的复杂性可能为
O(n)