运行结果是1, 为什么不是3?
import java.util.HashSet;
import java.util.Set;public class TestSet {

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 Test());
          set.add(new Test());
          set.add(new Test());
          System.out.println(set.size());
}
}

解决方案 »

  1.   

    读程序呀, 我是不理解程序的执行结果, 估计对Set容器知识点没掌握. 上面类名写错了, 应该是Test
      

  2.   

    Set就是传说中的散列表了,不能存储重复的元素。至于HashSet就是由HashMap的实例来支持,它通过对所存储的对象的hashCode()方法返回的hash码来决定存放位置。
    因为你的类中重写了hashCode()方法,并且每次返回都一样,所以在Set中只能存放一个。有关HashSet的详细信息请查看源代码!!!或API文档
      

  3.   

    你的代码看不出问题来,做了些改变:import java.util.HashSet;
    import java.util.Set;public class Test{
        private int i;
        public Test(int i){
         this.i = i;
        }
        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 Test(1));
              set.add(new Test(2));
              set.add(new Test(3));
              System.out.println(set.size());
        }
    }
    执行结果还是:1
    因为你重写了equals方法,每次添加时,调用此equals方法比较,可是此方法只返回真,也就是不管添加的对象是否相同都认为是相同的,所以不进行添加了,Set内只有对象new Test(1)的引用。没有new Test(2),new Test(3)的引用。
      

  4.   

    你故意跟自己作对么?
    Set的定义可以看文档
      

  5.   

    Set set=new HashSet(); 
    System.out.println(set.add(new Test(1)));
    System.out.println(set.add(new Test(2)));
    System.out.println(set.add(new Test(3)));结果true
    false
    false你把对象的身份标识重写
    public int hashCode(){
            return 1;
        }
        
        public boolean equals(Object b){
            return true;
        }  
    所以HashSet认为它们是重复的对象,所以后面两次添加失败。size = 1