小编adn*_*nan的帖子

来自Effective Java的第9项(等于合同):示例是否正确?

Bloch的精彩书籍"Effective Java"指出,如果equals不对称,则Collections的行为contains是不确定的.

在他给出的例子中(通过下面的小修改再现),布洛赫说他看到了"假",但也可以看到真实或异常.

如果标准没有指定contains(Object o)检查e.equals(o)o.equals(e)集合中的每个项目以及前者是否已实现,则可以看到"true" .然而,Collections Javadoc明确指出它必须是后者(这是我观察到的).

所以我看到的唯一可能是"假"或可能是异常(但是字符串Javadoc似乎排除了后者).

我理解更广泛的观点,非对称性可能equals会导致集合之外的代码出现问题,但我不会在他引用的例子中看到它.

我错过了什么吗?

import java.util.List;
import java.util.ArrayList;

class CIString {
  private final String s;

  public CIString(String s) {
    this.s = s;
  }

  @Override public boolean equals( Object o ) {
    System.out.println("Calling CIString.equals from " + this.s );
    if ( o instanceof CIString) 
      return s.equalsIgnoreCase( ( (CIString) o).s);
    if ( o instanceof String) 
      return s.equalsIgnoreCase( (String) o ); …
Run Code Online (Sandbox Code Playgroud)

java collections effective-java

5
推荐指数
1
解决办法
923
查看次数

标签 统计

collections ×1

effective-java ×1

java ×1