Java如何计算hashcode值
在設(shè)計(jì)一個(gè)類的時(shí)候,很可能需要重寫類的hashCode()方法,此外,在集合HashSet的使用上,我們也需要重寫hashCode方法來(lái)判斷集合元素是否相等。
下面給出重寫hashCode()方法的基本規(guī)則:
· 在程序運(yùn)行過(guò)程中,同一個(gè)對(duì)象多次調(diào)用hashCode()方法應(yīng)該返回相同的值。
·當(dāng)兩個(gè)對(duì)象通過(guò)equals()方法比較返回true時(shí),則兩個(gè)對(duì)象的hashCode()方法返回相等的值。
· 對(duì)象用作equals()方法比較標(biāo)準(zhǔn)的Field,都應(yīng)該用來(lái)計(jì)算hashCode值。
下面給出hashCode()方法的一般規(guī)則:
1) 把對(duì)象內(nèi)每個(gè)有意義的Field計(jì)算出一個(gè)int類型的hashCode值:
| Boolean | hashCode=(f?0:1) |
| 整數(shù)類型(byte short int char) | hashCode=(int)f |
| long | hashCode=(int)(f^(f>>>32)) |
| float | hashCode=Float.floatToIntBits(f) |
| double | long l = Double.doubleToLongBits(f); hashCode=(int)(l^(l>>>32)) |
| 普通引用類型 |
hashCode=f.hashCode() |
2) 用第一步計(jì)算出來(lái)的多個(gè)hashCode值組合計(jì)算出一個(gè)hashCode值返回:
return f1.hashCode()+(int)f2;
為了避免直接相加產(chǎn)生偶然相等,可以通過(guò)為各個(gè)Field乘以任意一個(gè)質(zhì)數(shù)后再相加。
return f1.hashCode()*17+(int)f2*13;
示例: 向HashSet集合中添加數(shù)據(jù):
class R
{
int count;
public R(int count)
{
this.count = count;
}
public String toString()
{
return "R[count:" + count + "]";
}
public boolean equals(Object obj)
{
if(this == obj)
return true;
if (obj != null && obj.getClass() == R.class)
{
R r = (R)obj;
if (r.count == this.count)
{
return true;
}
}
return false;
}
public int hashCode()
{
return this.count;
}
}
public class HashSetTest2
{
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
//打印HashSet集合,集合元素沒(méi)有重復(fù)
System.out.println(hs);
//取出第一個(gè)元素
Iterator it = hs.iterator();
R first = (R)it.next();
//為第一個(gè)元素的count實(shí)例變量賦值
first.count = -3; //①
//再次輸出HashSet集合,集合元素有重復(fù)元素
System.out.println(hs);
//刪除count為-3的R對(duì)象
hs.remove(new R(-3)); //
//可以看到被刪除了一個(gè)R元素
System.out.println(hs);
//輸出false
System.out.println("hs是否包含count為-3的R對(duì)象?"
+ hs.contains(new R(-3)));
//輸出false
System.out.println("hs是否包含count為5的R對(duì)象?"
+ hs.contains(new R(5)));
}
}
通過(guò)以上方式,我們可以輕松的去重寫一個(gè)類的hashCode()方法。
總結(jié)
以上是生活随笔為你收集整理的Java如何计算hashcode值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle如何创建普通用户并赋予权限
- 下一篇: 自己开发的在线视频下载工具,基于Java