Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList Contain始终返回false,尽管它包含相同的值_Java_Arraylist_Contain - Fatal编程技术网

Java ArrayList Contain始终返回false,尽管它包含相同的值

Java ArrayList Contain始终返回false,尽管它包含相同的值,java,arraylist,contain,Java,Arraylist,Contain,这是我的洞课 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

这是我的洞课

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));
它总是返回false!!它应该返回true

有什么我错过的吗

提前感谢

contains()
方法在检查时检查对象上的
equal()
方法

您必须验证equals方法才能使其工作

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

若您并没有验证equals方法,那个么默认的objectequals方法将执行,并且,按照equals方法的文档

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

因此,您的
userInputHole==leftFlowInnerHole
始终为false,因为它们指向不同的实例

因此,为了避免默认的实现,您只需验证yout类中的等价项并提供您的实现


您需要重写
类中从
对象
类继承的
equals
方法(因此也要重写
hashCode
以尊重契约,请参见)

如果此列表包含指定的元素,则返回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

您应该覆盖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;
}
这不起作用

我只是添加了这行代码来检查(for-loop)中的条件,然后它就可以正常工作了

在这种情况下不是执行equals()默认实现吗?为什么为false(因为默认实现使用==进行比较)?这是答案中遗漏的一点。
Hole a = new Hole(0,1);
leftFlowInnerHole.add(a);
System.out.print(leftFlowInnerHole.contains(a));
@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;
}
   if(priceidslist.contains(extraId)){
                               //Not working 
                            }
  String gh = String.valueOf(priceidslist.get(j));
                           if(gh.equals(extraId)){
                               rw.put("extraPrice",pricelist.get(j));
                           }