标签:lin 函数 方法 bool 字符 子类 情况 mat int
哈希码值(hashCode),也称散列码值是一个通过哈希散列算法得到的数据值,在java中可通过int hashCode()返回某对象的哈希码值。
这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。
hashCode有以下特点:
hashCode的计算方式:
字符串:\(s[0]*31^{(n-1)}+s[1]*31^{(n-2)}+...+s[n-1]^0\)
其中s[i]是字符串的第i个字符,n是字符串长度。空字符串的哈希值为0;
八大基本数据类型哈希值是固定:
?
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。
equals() : 它的作用也是判断两个对象的地址是不是相等。但它一般有两种使用情况:
情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。(object的equals方法是比较的对象的内存地址。)
情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。此时,标准流程如下:
//重写equals案例
class Person{
String name;
int age;
public boolean equals(Object obj){
if(this==obj) return true;//同一个对象
if(obj==null) return false;//空指针
if(this.getClass()!=obj.getClass()) return false;
//在方法参数中向上造型了,隐蔽了其中的子类属性
//必须要再向下造型,方可调用
Person person = (Person)obj;
//比较第一个属性
if(this.name==null){
if(person.name!=null){
return false;
}
}else if(this.name.equals(person.name)){
return false;
}
//比较第二个属性
if(this.age!=person.age) return false;
//到此为止,必然相同
return true;
}
}
【注】地址值实际就是该对象的哈希码值转为16进制的字符串形式。
?
?
当把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。
但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就会覆盖。如果不同的话,就会重新散列到其他位置。
标签:lin 函数 方法 bool 字符 子类 情况 mat int
原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/13232974.html