Set中的重复值异常

时间:2011-06-24 06:06:04

标签: java collections

据说那些实现Set接口的结构不允许重复元素。我只是想知道,复制是什么意思?价值方面是否重复?或者就物体而言。例如,我可以添加两个具有相同值的Integer对象。我也可以添加两次相同的对象。重复是什么意思?什么时候会抛出异常?

6 个答案:

答案 0 :(得分:4)

重复意味着在另一篇帖子a.equals(b)中解释,这意味着a.hashCode()==b.hashCode()。 但是,当你添加重复元素时,没有例外,只是它不会被添加两次。

答案 1 :(得分:2)

平等的定义取决于容器。 通常它是.equals()/。hashCode()关系,但是有一些容器使用identity来实现相等。

答案 2 :(得分:2)

java.util收藏集中,重复表示a.equals(b)应该暗示a.hashcode()==b.hashcode()

答案 3 :(得分:1)

根据Javadocs;它表示e1.equals(e2)返回true的任何两个元素都被视为重复元素。不同的集合实现使用不同的策略来存储元素; HashSet使用hashCode个对象,而TreeSet依赖于自然排序(Comparable接口)或自定义Comparator

答案 4 :(得分:0)

Fiver和Alvin给出了很好的答案,因为“aps”说他可以添加两个相同的整数和对象,但不会得到任何编译器错误或运行时异常,这是真的。

如果像你说的那样添加这些对象,然后运行一些像

这样的代码
System.out.println(theSetYouMade.size());

然后你会发现它没有添加你所说的重复项。

答案 5 :(得分:-2)

如果obj1返回true,则

obj2obj1.equals(obj2)重复。正如您所看到的,等于的定义实际上取决于equals的实现。

你可以写一个设置说,DistincObjectSet,其中重复意味着obj1==obj2

另一个例子是您可以拥有EmployeeSet,其中重复意味着obj1.employeeNo == obj2.employeeNo,在这种情况下,您应该覆盖Employee类中的equals()方法以比较员工编号。

Set API的设计表示您尝试添加重复元素,add()方法应返回false而不是抛出异常。