覆盖等于

时间:2013-12-08 14:47:01

标签: java arraylist

我有这堂课:

public class Phone{ 
    private String number;
    //get and set of class
}

然后我有另一个使用“电话”的课程

public class Antena{
   private String name;
   private ArrayList<Phone> phones;
}

现在在添加元素之前,我只想添加元素在数组中不存在。我是Java新手,经过一些研究后发现我需要覆盖equals方法。那么有人可以给我一些提示吗?

这就是我使用equals方法的方法:

if(!phones.equals(phone))
   phones.add(phone);

2 个答案:

答案 0 :(得分:1)

评论现在有足够的信息来实际回答这个问题。

第1部分

实施等于:

public boolean equals(Object obj) { 
  if (obj == null) return false;
  if (obj.getClass() != this.getClass()) return false;
  Phone t = (Phone ) obj; 
  return t.number.equals(this.number);
}

第2部分

实施哈希码

public int hashCode() {
  return number.hashCode();
}

第3部分

使用set而不是ArrayList来要求唯一性。

private HashSet<Phone> phones;

答案 1 :(得分:0)

重写equals方法以对类对象进行相等测试。 例如,您有两个Phone对象p1和p2。

Phone p1 = new Phone();
Phone p2 = new Phone();
p1.setNumber(10);
p2.setNumber(10);
\\Ideally these two objects are equal but when you try to do equality test , it will return false.
System.out.println(p1==p2);  // outputs false because p1 and p2 are two different references 

持有不同的内存地址。 另外,

System.out.println(p1.equals(p2));  // prints false when not overrided 

当你重写equals方法时,你可以添加一个标准来逻辑测试这两个对象。

public boolean equals(Object obj)
  {

    if (!(obj instanceof Phone)) 
      return false;
    return this.getNumber() == ((Phone)obj).getNumber();
  }

现在,如果在p1和p2对象上调用equals方法,它将返回true。 当您想要基于实例变量而不是引用地址来等同两个类对象时,等于方法测试很有用。