第一个,关于hashCode()方法:
在Java编程语言中,每个类都提供hashCode()方法,这个方法会把类的一个实例(即对象)里面的数据转化为一个哈希值(涉及加密法,是一个32位的带符号整数),当存储或操作一个实例时(此实例应为了均匀分布在不同的输出中以便在加密时使用)这个哈希值会被其他代码使用。
这是一个很重要的特性,以便去使用哈希表格和其他的数据结构(此数据结构是为了存储objects于建立在其他哈希运算上的集合中的)。
技术上来说,在java,hashCode()方法是一个默认上的方法。意味着,当他被直接运用在JVM里面的原代码时,她有改特性的元性。
所有的类都继承自基本的类java.lang.Object中的一个基本的哈希方案,而不是重新写一个哈希函数一处理他们的数据。提供自己的应用的类必须override那个object的方法即hashCode()。
基本的协议就是为了这个方法内已经override了的应用,他们保持在与同样的object里面的equals()的方法一贯的方式中:一个提供的object必须要一贯的给出同样的哈希值(除非它改变了,那么新版本将不再被认为“equal”(等同于)旧值了),并且那两个object(即equal()关联的两个)必须提供一样的哈希值。在那些哈希值在不同的java应用中,甚至在同意程序的不同执行文件执行中的,都没必要保持一致,并且当需要两个不相等的object要有不同的哈希值时,这并不是强制的(即,应用的哈希函数不需要是完美哈希函数)
例子:
下面的类Employee通过组合它成员的哈希数来实现它的哈希函数。
public class Employee {
int employeeId;
String name;
Department dept;
。。。 。。。 // 其他的一些方法在这里
@Override
public int hashCode() {
int hash = 1;
hash = hash * 17 + employeeId;
hash = hash * 31 + name.hashCode();
hash = hash * 13 + (dept == null ? 0 : dept.hashCode());
return hash;
}
} |