已知哈希码是根据对象特性生成,但是还是会存在不同对象计算出相同哈希码的巧合。今天以String为例进行了验证。
代码如下:
import java.util.HashSet;
import java.util.Random;
/**
* Test Clazz
* @author Lix
*/
public class Test{
public static final int SIZE = 7;
public static final int TIME = 100000;
public static void main(String argv[]){
HashSet
hsi = new HashSet
();
HashSet
hss = new HashSet
();
Random ra = new Random();
StringBuffer sb;
String tempString = "";
for (int i = 0; i < TIME; i++) {
sb = new StringBuffer();
for (int j = 0; j < SIZE; j++) {
sb.append((char)(ra.nextInt(26)+97));
}
tempString = sb.toString();
//System.out.println(tempString);
if(!hsi.add(tempString.hashCode())){
System.out.println("HashCode:"+tempString.hashCode());
System.out.println("String A:"+tempString);
for(Object obj:hss){
if(obj.hashCode() == tempString.hashCode() && !obj.equals(tempString)){
System.out.println("String B:"+obj);
}
}
}
hss.add(tempString);
}
System.out.println(hss.size()+":"+hsi.size()+"\n");
System.out.println("\nExample:");
String a = "mvnjdam";
String b = "wlosaru";
String c = "ypxludk";
String d = "tuwwvkg";
String e = "wmriczg";
String f = "rrqtebc";
System.out.println("a.hash:"+a.hashCode()+"\nb.hash:"+b.hashCode());
System.out.println("c.hash:"+c.hashCode()+"\nd.hash:"+d.hashCode());
System.out.println("e.hash:"+e.hashCode()+"\nf.hash:"+f.hashCode());
}
}
因此,在某些需要进行String严格比较的场合,需要在哈希码比较验证之后追加equals比较验证。