据说那些实现Set接口的结构不允许重复元素。我只是想知道,复制是什么意思?价值方面是否重复?或者就物体而言。例如,我可以添加两个具有相同值的Integer对象。我也可以添加两次相同的对象。重复是什么意思?什么时候会抛出异常?
答案 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,则 obj2
与obj1.equals(obj2)
重复。正如您所看到的,等于的定义实际上取决于equals的实现。
你可以写一个设置说,DistincObjectSet,其中重复意味着obj1==obj2
另一个例子是您可以拥有EmployeeSet,其中重复意味着obj1.employeeNo == obj2.employeeNo,在这种情况下,您应该覆盖Employee类中的equals()方法以比较员工编号。
Set API的设计表示您尝试添加重复元素,add()方法应返回false而不是抛出异常。