似乎这在(粗体的)JavaDoc中有
TreeSet很好的记录:
注意,如果要正确实现接口,则由一个集合(无论是否提供显式比较器)维护的顺序
必须与equals一致Set。(请参见Comparable或Comparator对于与equals一致的精确定义。)之所以如此,是因为Set接口是根据equals*** 作定义的,但是TreeSet
实例使用其compareTo(或compare)方法执行所有元素比较,因此两个元素被视为相等从集合的角度来看,此方法是相等的。
集合的行为是明确定义的,即使其顺序与equals不一致也是如此; 它只是不能遵守Set接口的一般约定。
这是唯一实现
Comparable但与不一致的(?)JDK类的示例
equals():
Set<BigDecimal> decimals = new HashSet<BigDecimal>();decimals.add(new BigDecimal("42"));decimals.add(new BigDecimal("42.0"));decimals.add(new BigDecimal("42.00"));System.out.println(decimals);
decimals在最后有三个值,因为
42,
42.0并且
42.00是不相等的,只要
equals()关注。但是,如果将其替换
HashSet为
TreeSet,则结果集仅包含一项(
42-刚好是第一个添加的项),因为使用进行比较时,它们都被认为是相等的
BigDecimal.compareTo()。
这表明在使用与不一致的类型时
TreeSet,这以“ 损坏 ” 的方式出现
equals()。它仍然可以正常工作,并且所有 *** 作都定义明确-
只是不遵守
Set类的约定-如果两个类不是
equal(),则它们不会被视为重复。也可以看看
- 比较等于等于是什么意思?如果我的课堂不遵循这一原则,可能会发生什么?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)