它使用.equals语句JAVA做它不应该做的事情

时间:2014-05-28 13:26:52

标签: java equals

我检查2个对象(数组列表中的一个新对象)是否匹配。如果他们这样做,程序会打印"Company exists already!",如果它们不匹配,则新对象会被添加到列表中。

问题在于,当我尝试将相同的对象(相同的值)放两次时,它表明它已经存在,就像它应该但是当我输入完全新的对象(具有不同的值)时,它仍然显示该消息但是将对象添加到数组列表

if(companyList.size()!=0){
  for(i=0;i<companyList.size();i++){
    Company oldCom = companyList.get(i); 
    if(newUab.equals(oldCom)==true){

      JOptionPane.showMessageDialog(null, "Company exists already!");
      break;
    }
    else{
      companyList.add(newUab);
    }
  }

}
else{
  companyList.add(newUab);
}

我试过这个System.out.println(newUab.equals(oldCom));并且总是给true 但我不明白为什么当它们不同时,对象被放入数组列表中,当它们相同时它不会在两种情况下都打印出消息?

我是否遗漏了某些内容,或者我花了多长时间查看代码并且再也看不到我的错误了?

编辑:我把这两个类都放了,因为我对一些方法的工作缺乏了解(我认为它应该是UAB类方法导致该对象属于这个类) 公司类(父母)

public class Company {
    public  String b;// boss
    public String n;// name
    public Company(String boss, String name){
    b=boss;
    n=name;
}

    @Override
    public int hashCode() {
        int hash = 7;
        int newHash;
        hash = 43 * hash + Objects.hashCode(this.b);
        hash = 43 * hash + Objects.hashCode(this.n);
        newHash=hash;
        return newHash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Company other = (Company) obj;
        if (!Objects.equals(this.b, other.b)) {
            return false;
        }
        if (!Objects.equals(this.n, other.n)) {
            return false;
        }
        return true;
    }

UAB班(公司的孩子):

public class UAB extends Company {
    private  int w;//workers
    public UAB(String boss,String name,int workers){
        super(boss,name); 
        w=workers;

}

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 17 * hash + this.w;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final UAB other = (UAB) obj;
        if (this.w != other.w) {
            return false;
        }
        return true;
    }

4 个答案:

答案 0 :(得分:4)

为什么不让ArrayList#contains检查您的物品是否存在?

并希望您重写equals以根据自定义参数比较您的对象。

谢谢,

答案 1 :(得分:3)

您的问题在这里&gt;&gt;

else{
    companyList.add(newUab);
}

正如你所说的新对象,它打印出“公司已经存在!” 并且仍然添加它,然后添加到列表的执行将在上面的行

答案 2 :(得分:1)

如果对象与列表中的第一个不匹配,则会将其添加到数组中。在与列表中的每个对象进行比较之前,无法添加到数组中。一个更好的解决方案可能是调用list。contains(newUab),而不是自己迭代列表并调用.equals。

答案 3 :(得分:0)

首先让我们来看看你现有的 equals 方法。你正在使用Objects.equals方法,这有点奇怪,因为它只是在检查无效后调用 firstArgument .equals( secondArgument ),但你已经检查了一下

你应该做什么:

@Override
public boolean equals(Object obj) {
    if ( ! obj instanceof Company ) {
        return false;
    }

    Company other = (Company) obj;

    return this.b.equals(other.b) && this.n.equals(other.n);
}

正如其他人所说,您应该使用List接口的contains方法而不是实现自己的方法。此外,如果对象的顺序不重要,您应该考虑使用Set。在集合中,你不能有重复项,如果你试图添加一个&#34;等于&#34;那么添加就会失败(返回false)。元件。

此外,在您的UAB课程中,您还需要检查 b n 参数。您可以使用&#34; super&#34;来调用父 equals 方法。关键字...

另一个建议:查找java源代码!去看看在ArrayList和其他类中做了什么。您将看到它们如何实现contains方法,您可以将其作为起点。