【发布时间】:2011-06-24 06:06:04
【问题描述】:
据说那些实现 Set 接口的结构不允许重复元素。我只是想知道,他们所说的重复是什么意思?在值方面重复?或者就对象而言。例如,我可以添加两个相同值的 Integer 对象。我还可以添加两次相同的对象。他们所说的重复是什么意思?什么时候会抛出异常?
【问题讨论】:
标签: java collections
据说那些实现 Set 接口的结构不允许重复元素。我只是想知道,他们所说的重复是什么意思?在值方面重复?或者就对象而言。例如,我可以添加两个相同值的 Integer 对象。我还可以添加两次相同的对象。他们所说的重复是什么意思?什么时候会抛出异常?
【问题讨论】:
标签: java collections
重复的意思是在另一篇帖子a.equals(b) 中解释,这意味着a.hashCode()==b.hashCode()。
但是,当你添加重复元素时,不会有任何异常,只是不会被添加两次。
【讨论】:
相等的定义取决于容器。 通常是 .equals()/.hashCode() 关系,但也有一些容器使用身份来表示相等。
【讨论】:
equals() 在这里是一个更合适的答案。当然,YMMV。
在java.util 集合中,重复意味着a.equals(b) 并且应该 暗示a.hashcode()==b.hashcode()
【讨论】:
根据 Javadocs;这意味着e1.equals(e2) 返回 true 的任何两个元素都被视为重复元素。不同的集合实现使用不同的策略来存储元素; HashSet 使用对象的hashCode,而TreeSet 依赖于自然排序(Comparable 接口)或自定义Comparator。
【讨论】:
Fiver 和 Alvin 给出了很好的答案,因为“aps”表示他可以添加两个相同的整数和对象,但不会出现任何编译器错误或运行时异常,这是真的。
如果你像你说的那样添加这些对象,然后像这样运行一些代码
System.out.println(theSetYouMade.size());
然后您会看到它没有添加您所说的那些重复项。
【讨论】:
obj1 是 obj2 的副本,如果 obj1.equals(obj2) 返回 true。所以你可以看到,equal的定义实际上取决于equals的实现。
你可以写一个集合,比如 DistincObjectSet 其中重复的意思是obj1==obj2
另一个例子是你可以有 EmployeeSet,其中重复意味着 obj1.employeeNo == obj2.employeeNo,在这种情况下,你应该覆盖 Employee 类中的 equals() 方法来比较员工编号。
Set API 的设计表明您尝试添加重复元素,add() 方法应该返回 false 而不是抛出异常。
【讨论】: