equals&hashcode

import   java.util.*;
class   A  
{
private   int   i;
public   A(int   i){
this.i   =   i;
}
public   String   toString(){
return   "   "+i;
}
public   boolean   equals(Object   o){
A   a   =   (A)o;
return   (a.i==i)   ?   true   :   false   ;
}
public   int   hashCode(){
return   i;
}
}
public   class   TestA
{
public   static   void   main(String[]   args){
HashSet   set   =   new   HashSet();
for(int   i   =   0;i <=3;i++)
set.add(new   A(i));
System.out.println(set);
set.add(new   A(1));
System.out.println(set);
System.out.println(set.contains(new   A(0)));
System.out.println(set.add(new   A(1)));
System.out.println(set.add(new   A(4)));
System.out.println(set);
}
}

hashCode()是用来产生哈希玛的,而哈希玛是用来在散列存储结构中确定对象的存储地址的,
(这一段在   Java编程思想   中讲的很清楚的)象util包中的带hash的集合类都是用这种存储结构 
:HashMap,HashSet,他们在将对象存储时(严格说是对象引用),需要确定他们的地址吧, 
而HashCode()就是这个用途的,一般都需要重新定义它的,因为默认情况下,
由Object类定义的hashCode方法会针对不同的对象返回不同的整数,
这一般是通过将该对象的内部地址转换成一个整数来实现的,现在举个例子来说,
就拿HashSet来说,在将对象存入其中时,通过被存入对象的hashCode()来确定对象在HashSet中的存储地址,
通过equals()来确定存入的对象是否重复,hashCode(),equals()都需要自己重新定义,
因为hashCode()默认前面已经说啦,而equals()默认是比较的对象引用,你现在想一下,
如果你不定义equals()的话,那么同一个类产生的两个内容完全相同的对象都可以存入Set,
因为他们是通过equals()来确定的,这样就使得HashSet失去了他的意义,看一下下面这个:

你可能感兴趣的:(编程)