【问题标题】:Java ArrayList Contain always return false although it contain the same valueJava ArrayList Contain 总是返回 false,尽管它包含相同的值
【发布时间】:2014-01-18 12:41:48
【问题描述】:

这是我的洞课

class Hole {

public  int a;
public  int b;

Hole(int a, int b) {
    this.a = a;
    this.b = b;
}

所以我添加了一个包含几个孔的 ArrayList

public void checkPathLoop(int x, int y) {
        //rough code

        ArrayList<Hole> leftFlowInnerHole = new ArrayList<>();


        //left holes rules
        leftFlowInnerHole.add(new Hole(0, 1));
        leftFlowInnerHole.add(new Hole(1, 5));
        leftFlowInnerHole.add(new Hole(5, 4));
        leftFlowInnerHole.add(new Hole(0, 4));

当我添加时

Hole userInputHole = new Hole(0,1);
System.out.print(leftFlowInnerHole.contain(userInputHole));

它总是返回 false !它应该返回true。

有什么我想念的吗?

提前谢谢你

【问题讨论】:

    标签: java arraylist contain


    【解决方案1】:

    这不行

       if(priceidslist.contains(extraId)){
                                   //Not working 
                                }
    

    我刚刚添加了这行来检查(for -loop)中的条件,然后它工作正常

      String gh = String.valueOf(priceidslist.get(j));
                               if(gh.equals(extraId)){
                                   rw.put("extraPrice",pricelist.get(j));
                               }
    

    【讨论】:

      【解决方案2】:

      你应该覆盖 Hole 类的 equals 方法:

      @Override
      public boolean equals(Object obj) {
      
      if (obj == this) {
          return true;
      }
      
      if (!(obj instanceof Hole)) {
          return false;
      }
      
      Hole other = (Hole) obj;
      
      return a == other.a && b == other.b;
      }
      

      【讨论】:

        【解决方案3】:

        contains() 方法在检查时检查 Object 上的 equal() 方法。

        您必须覆盖 equals 方法才能使其工作。

        public boolean contains(Object o)

        如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 满足 (o==null ? e==null : o.equals(e)) 时才返回 true。

        Edit:
        

        如果您不使用 equals 方法,则默认执行 Object 的 equals 方法,并且根据 Equals 方法的文档

        Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。 p>

        所以你的userInputHole == leftFlowInnerHole 总是错误的,因为它们指向不同的实例。

        因此,为了避免默认实现,您只需在您的类中覆盖 equals 并提供您的实现。

        An efficient equals(Object o) implementation

        【讨论】:

        • 这种情况下不执行equals()默认实现吗?
        • 为什么是假的(因为默认实现使用 == 进行比较)?这是答案中缺少的一点。
        【解决方案4】:

        您需要在您的Hole 类中重写从Object 类继承的equals 方法(因此还要遵守hashCode 的约定,请参阅Why do I need to override the equals and hashCode methods in Java?)。

        如果此列表包含指定元素,则返回 true。更多的 正式地,当且仅当此列表包含至少一个时才返回 true 元素 e 使得 (o==null ? e==null : o.equals(e))。

        基本上默认的equals实现是两个对象之间的==比较

        public boolean equals(Object obj) {
           return (this == obj);
        }
        

        由于您创建了两个不同的对象,虽然它们与属性具有相同的值,但它们是两个不同的对象,因此this == obj 返回false

        如果你这样做了:

        Hole a = new Hole(0,1);
        leftFlowInnerHole.add(a);
        System.out.print(leftFlowInnerHole.contains(a));
        

        你会看到它输出了true

        【讨论】:

          猜你喜欢
          • 2018-12-02
          • 2021-09-23
          • 2017-01-03
          • 1970-01-01
          • 2012-02-01
          • 2021-01-28
          • 1970-01-01
          • 2014-10-02
          • 2012-11-01
          相关资源
          最近更新 更多