黑马程序员技术交流社区

标题: 一位网友发来的面试题,大家围观了.... [打印本页]

作者: 我能驾驭住    时间: 2012-6-5 08:07
标题: 一位网友发来的面试题,大家围观了....
//重写了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  

作者: 郭宁    时间: 2012-6-5 08:15
o(︶︿︶)o 唉 看到代码不在 代码区 编辑发布,我都感觉~~~~~
作者: 刘克方    时间: 2012-6-5 08:44
当使用Hashset时,hashcode()方法会被调用,判断以存储在集合中的对象的hashcode值是否与将要添加的对象的hashcode值一样;如果不一样,就直接将对象加入集合,如果一样,再进行equals方法比较,如果equals方法返回true表示该对象在集合中已存在,不会添加进去,如果equals返回false,则将对象添加进去。
这里要注意下:如果不重写hashcode和equals方法,父类Object的hashcode()方法返回的对象在内存的地址,equals方法也一样;这就是出现上面结果的原因
作者: 黑马11期李项京    时间: 2012-6-5 09:27
如果是我,可能这样回答,ArrayList 不用比较hashcode,在list.contains(f3)中,程序通过list的equals()判断list中有没f3这个对象,而HashSet 要比较hashcode,所以在set.contains(f4)中,程序通过equals()和hashCode()判断set集合中有没f4,默认初始化每个对象的hashCode都不同,所以要覆盖set中的hashCode()方法
作者: 丰亚彬    时间: 2012-6-5 10:25
这个面试题应该是考List和Set的区别
List集合元素可以重复,判断元素相同调用equals方法
Set集合元素不可以重复,判断元素相同使用hashCode和equals两个方法
作者: liumeng    时间: 2012-6-5 11:34
HashSet先判断hashcode如果相同在判断equal如果不同则返回false




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2