hash code 即散列码根据对象计算出的一个整型值,散列码是没有规律的。
如果两个对象相等(equal() 返回true),则hashCode一定相等,如果两个对象hashCode相等,则对象不一定相等。
String类的散列码计算如下:根据内容计算
- int hash = 0 ;
- for ( int i = 0 ; i < length (); i ++) {
- hash = 31 * hash + charAt (i );
- }
Object类则是根据对象的存储地址计算的。
- String s = "OK" ;
- StringBuilder sb = new StringBuilder (s);
- String t = new String ("OK" );
- StringBuilder tb = new StringBuilder (t);
上面四个对象的散列码如下:
2524
25860399
2524
5184781
字符串s和t的散列码相同,则是由内容计算出,而sb和tb的散列码则是根据存储地址而来。
HashCode方法作用:
在java的集合中Set是不允许元素有重复的,如果调用equal方法,新的元素每次都要和Set中所有元素比较一次,非常浪费时间。采用hash表原理可以提高效率。
hash码是由对象存储地址算出来的,根据hash码就可以找到对象的物理存储位置,只要判断该位置是否有元素即可。有则代表Set中已经有相等元素,没有,则可以将新元素插入Set中。