1、任何class如果覆写了equals()方法,就必须覆写hashCode()。
2. map是根据equals()和hashCode()来判断对象是否相等,所以在类里覆写了equals(),就一定要覆写hashCode()。
关于Hashtable,判断key是否相同的条件是:hashCode()相同 && 满足equals(),而一个类如果没有覆写equals()方法,
那么这个类的equals方法比较的是对象的内存地址。如果没有覆写HashCode,那么该类的hashCode是通过对象的内存地址转换而来.
3. 在程序执行期间,同一个对象调用hashCode()必须返回同一个值(同一个应用执行期)。
散列码不必是独一无二的(应该更关注生成速度,而不是唯一性),但是通过hashCode()和equals(),
必须完全能够确定对象。
4. 如果两个对象equals,那么他们的hashCode()必须相等。
5. Map.put(key,value)时根据key.hashCode生成一个内部hash值,根据这个hash值将对象存放在一个table中。
Map.get(key)会比较key.hashCode和equals方法,当且仅当这两者相等时,才能正确定位到table;
java中Set是通过Map实现的,所以Map和Set的所有实现类都要注意这一点.
6. 如果想判断是否两个对象引用指向同一个实体,唯一的正确途径是使用==,因为只有它不会被重构,要慎用hashCode。
7. 有一点我们应该是能够确认的,就是同样的数字转换成hashCode后的值肯定一样,
因此我们在覆写hashCode时候应该利用自己编写的类独特属性进行hashCode运算(当然不仅仅是一个属性,可以是多个属性),
这样我们就可以尽量的保证每个类对象的具有不同的hashCode,如果这些不同的对象有机会进入同一个map的时候就可以保证其hashCode不一样,
从而提高map的检索。
8. 有关hashCode()计算
boolean c=(f ? 0 : 1)
byte,char,short, int c=(int)f
long c=(int)(f^(f>>>32))
float c=Float.floatToIntBits(f);
double long l = Double.doubleToLongBits(f);
c=(int)(l^(l>>>32))
Object c=f.hashCode()
//
int f = 17;
result = 37*result + c;
2. map是根据equals()和hashCode()来判断对象是否相等,所以在类里覆写了equals(),就一定要覆写hashCode()。
关于Hashtable,判断key是否相同的条件是:hashCode()相同 && 满足equals(),而一个类如果没有覆写equals()方法,
那么这个类的equals方法比较的是对象的内存地址。如果没有覆写HashCode,那么该类的hashCode是通过对象的内存地址转换而来.
3. 在程序执行期间,同一个对象调用hashCode()必须返回同一个值(同一个应用执行期)。
散列码不必是独一无二的(应该更关注生成速度,而不是唯一性),但是通过hashCode()和equals(),
必须完全能够确定对象。
4. 如果两个对象equals,那么他们的hashCode()必须相等。
5. Map.put(key,value)时根据key.hashCode生成一个内部hash值,根据这个hash值将对象存放在一个table中。
Map.get(key)会比较key.hashCode和equals方法,当且仅当这两者相等时,才能正确定位到table;
java中Set是通过Map实现的,所以Map和Set的所有实现类都要注意这一点.
6. 如果想判断是否两个对象引用指向同一个实体,唯一的正确途径是使用==,因为只有它不会被重构,要慎用hashCode。
7. 有一点我们应该是能够确认的,就是同样的数字转换成hashCode后的值肯定一样,
因此我们在覆写hashCode时候应该利用自己编写的类独特属性进行hashCode运算(当然不仅仅是一个属性,可以是多个属性),
这样我们就可以尽量的保证每个类对象的具有不同的hashCode,如果这些不同的对象有机会进入同一个map的时候就可以保证其hashCode不一样,
从而提高map的检索。
8. 有关hashCode()计算
boolean c=(f ? 0 : 1)
byte,char,short, int c=(int)f
long c=(int)(f^(f>>>32))
float c=Float.floatToIntBits(f);
double long l = Double.doubleToLongBits(f);
c=(int)(l^(l>>>32))
Object c=f.hashCode()
//
int f = 17;
result = 37*result + c;