创建了一个HashSet的集合对象,
然后自定义了3个Student对象,
因为要去重,所以重写了hashCode方法和equals方法
因为重写equals方法时要向下转型,所以为了避免传进来的类型不同,要用getClass方法比较字节码文件,如果不同就直接返回false但是到这里我就有一个问题,如果传进来一个Teacher对象,并且和其中一个Student对象的hash值完全一样,于是比较equals方法,这个时候因为字节码不同,就会直接返回false,这样岂不是直接添加成功了吗?怎么能这样,求教!

解决方案 »

  1.   

    HashSet里存对象,那么去重的话一般是根据对象的属性去判断的,不是比较字节码。
    比如,如果传进来的两个student的name属性都是“aaa”,就判断这两个对象是相同的。当然具体的判断条件根据需求定。
    所以只要比较那些有特殊含义的属性就行,没必要这么复杂的。
      

  2.   

    按照这个逻辑false分支下,也有两个判断分支的,不能直接返回,这里也需要判断的。不过,感觉这个逻辑有点奇怪哦
      

  3.   

    按照这个逻辑false分支下,也有两个判断分支的,不能直接返回,这里也需要判断的。不过,感觉这个逻辑有点奇怪哦
    我也感觉好奇怪,我想的太多了
      

  4.   

    你创建HaseSet的时候可以指定他内部放什么类型的数据啊。 或者使用泛型就行。 这样非Student类型的就存不进去了。
    至于equals里面的代码,可以参考源码来实现,因为equals就是判断内容是否相同的。不相同肯定就要返回false
      

  5.   

    是否相同的第一个条件就是类的名称(包名+类名)是否相同,Teacher和student肯定是不相同啦
      

  6.   

    不知道你的Set用的什么泛型,如果限制用Student的话,传一个Teacher没有编译错误吗?
    如果没用泛型或者泛型是Teacher和Student的共同父类,那么Tercher对象和Student对象本来就是不同的对象,所以返回false,被添加到Set里也是正常啊。
    是我没有理解LZ的意思吗?
      

  7.   

    hashcode方法是equals的前置方法,如果只要你用生成的hashcode方法就OK,只要你定义的equals方法比较相等条件即可,hashcode不是去重的方法,是用哈希算法降低冲撞的方法。