论述题 16.  在HashSet中,equals与hashCode之问的关系是什么?
【正确答案】HashSet是存在于java.util包中的类,HashSet中存储的元素是不能重复的,由于HashSet中存放的是对象,那么如何判断两个对象是否相同呢?主要通过hashCode和equals两个方法来判断,所以,对于在HashSet中存储的对象,对应的类最好根据实际情况实现自己的equals方法和hashCode方法。
   每当向HashSet中添加一个元素的时候,可以采用下面的方法来判断两个对象是否“相同”:
   1)如果两个对象的hashCode值不同,那么说明两个对象不“相同”。
   2)如果两个对象的hashCode值相同,接着会调用对象的equals方法,如果equlas方法的返回结果为true,那么说明两个对象“相同”,否则,说明两个对象不“相同”。
   有读者可能对hashCode方法与equals方法不是很理解,其实,hashCode方法和equals方法都定义在Object类中,所有的Java类都继承这两个方法。其中,hashCode方法返回一个int类型的数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。而equals方法主要用于判断对象的内存地址引用是否是同一个地址(是否是同一个对象),如果两个对象“相同”,那么返回true,否则,返回false。一般情况下需要重写equals和hashCode方法来实现自己的逻辑,比如String类中的equals方法用来判断两个字符串的内容是否相同。
   HashSet采用上面的逻辑来判断两个对象是否“相同”,从而决定一个对象是否应该被加入到HashSet中。
   示例:下列程序中构造了一个Set并且调用其方法add(),输出结果是什么?
   public class A
   {
   public int hashCode(){return 1;}
   public Boolean equals(Object b){return true}
   public static void main(String args[]){
   Set set=new HashSet();
   set.add(new A());
   set.add(new A());
   set.add(new A());
   System.out.println(set.size());
   }
   }
   答案:1。
【答案解析】