import java.util.HashSet;
import java.util.Set;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("the set size is:"+set.size()); 


这个时候结果为1,如果去掉public boolean equals(Object b){return true;} 方法时结果为3,能不能解释这里的原理?

解决方案 »

  1.   

    很明显这里set的size()方法实现原理就是根据equals来实现的,若是 对象1.equals(对象2),那么认为这是一个对象,这里你把equals()方法return true,即使你再new出来100个A,结果一样,因为equals方法决定了他们都是相同的,
      

  2.   

    所以在往类集里面添加自定义类型数据时候,要重写equals和hashcode方法,又因为set存放不重复的数据类型,所以你去掉equals方法之后,它默认的是新的对象!
      

  3.   

    Set判断对象是否相等就是调equals方法,你的equals方法写成这样,当然只能加进去一个了。
      

  4.   

    其中public int hashCode(){return 1;}该方法重写和重写感觉区别不大
      

  5.   

    《Effective Java》还是有必要看一看的
      

  6.   

    坚决同意!Joshua Bloch的书都得看一看
      

  7.   

    谢谢和位,是该补一下这块。谁有清晰这本书的PDF文档发一份给我[email protected]。网上找了一下没找到合适的
      

  8.   

    public boolean equals(Object b){return true;}  当你从写了这个方法并且返回true时虽然你写了三次set.add(new A());但set集合中的元素是不会重复的,所以相当你只添加了一次当你去掉public boolean equals(Object b){return true;}他默认返回的equalse和==是相同三个new A()此时就不再相同了
      

  9.   

    菜鸟有2个问题:public int hashCode(){return 1;}  这个是干嘛的,有被调用到吗?还有set.add(new A());用到了3次,它们每次添加到集合中的都不一样吗?能不能解释下3个相同的添加。谢谢了。
      

  10.   

    一般判断两个对象是否相对,不仅要看equals的值是否为true,还要看他们的hashcode是否相同。如果没有删掉public boolean equals(Object b){return true;} ,那么不管是哪两个对象,他们都满足equals返回值为true,且hashcode都为1,所以两对象相等。而没有删去那一行代码,情况就不一样啦。要知道两对象的hashcode不相等可以断定两个对象不等,但hashcode相等却不能肯定两对象相等。只有同时满足hashcode相等和equals返回true才算相等。删掉public boolean equals(Object b){return true;} 类A会使用Object类的equals来比较两个对象,所以各对象当然不等。综上,对象个数为3。
      

  11.   

    补充一下,HASHSET集合的元素有无序不重复的特点。
      

  12.   

    有些JAVA原理性的东西搞的不是很明白。如果这题也是不知道如何解的话建议和我一样大家好好看一下这本书吧《Effective Java》第二版。结帖了。