A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//重写了equals()而没有重写hashCode()方法
package Demo.collection;
import java.util.ArrayList;  
import java.util.Iterator;
import java.util.HashSet;  
  
public class Foo {  
  
   int value;  
  
   Foo(int value) {  
  
      this.value = value;  
  
   }  
  
public boolean equals(Object obj) {  
  
     if (obj instanceof Foo) {  
  
       Foo foo = (Foo) obj;  
  
       return value == foo.value;  
  
     } else {  
  
        return false;  
  
     }  
  
  }  
  
/*public int hashCode() {

         return this.value;

   }
*/

  
   public static void main(String... args) {  
  
      ArrayList list = new ArrayList();  
  
      HashSet set = new HashSet();  
  
        
  
      Foo f1 = new Foo(1);  
  
      Foo f2 = new Foo(1);  
  
      list.add(f1);  
  
      set.add(f2);  
  
        
  
      Foo f3 = new Foo(1);  
  
      Foo f4 = new Foo(1);  
   
   
   
      System.out.println(list.contains(f3) + "," + set.contains(f4));  
  
   }  
  
}

运行结果:true false
打开注释:true true  

评分

参与人数 1黑马币 +10 收起 理由
黄奕豪 + 10 不错的分享~要用哈希的东西,要想好用,必.

查看全部评分

5 个回复

倒序浏览
o(︶︿︶)o 唉 看到代码不在 代码区 编辑发布,我都感觉~~~~~
回复 使用道具 举报
当使用Hashset时,hashcode()方法会被调用,判断以存储在集合中的对象的hashcode值是否与将要添加的对象的hashcode值一样;如果不一样,就直接将对象加入集合,如果一样,再进行equals方法比较,如果equals方法返回true表示该对象在集合中已存在,不会添加进去,如果equals返回false,则将对象添加进去。
这里要注意下:如果不重写hashcode和equals方法,父类Object的hashcode()方法返回的对象在内存的地址,equals方法也一样;这就是出现上面结果的原因

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 理解得很好!

查看全部评分

回复 使用道具 举报
如果是我,可能这样回答,ArrayList 不用比较hashcode,在list.contains(f3)中,程序通过list的equals()判断list中有没f3这个对象,而HashSet 要比较hashcode,所以在set.contains(f4)中,程序通过equals()和hashCode()判断set集合中有没f4,默认初始化每个对象的hashCode都不同,所以要覆盖set中的hashCode()方法

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 恭喜,完成任务了~~黑马见

查看全部评分

回复 使用道具 举报
这个面试题应该是考List和Set的区别
List集合元素可以重复,判断元素相同调用equals方法
Set集合元素不可以重复,判断元素相同使用hashCode和equals两个方法

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 恭喜哦!期待黑马见~~~

查看全部评分

回复 使用道具 举报
HashSet先判断hashcode如果相同在判断equal如果不同则返回false
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马