java中的hash值
1、Hash值有什么用?
? ? ?HashMap、HashTable、HashSet,所以涉及到使用Hash值進行優(yōu)化存儲的地方,都會用到HashCode。HashCode是Key,這種計算為提高計算的性能。想想看,一般來說,數(shù)組算是比較快的集合類了吧,直接用index定位元素,簡直就是O(1)的級別。但是添加元素就不這么樂觀了。但是使用hash類的集合,添加元素,移動的元素少,只影響一小塊,并且查找元素,由于hash值已經(jīng)進行了定位分組,所以也會大大縮小涉及面,快速定位。
?
2、Hash值應(yīng)該符合什么原則?
? ? ?A、等冪性。不管執(zhí)行多少次獲取Hash值的操作,只要對象不變,那么Hash值是固定的。如果第一次取跟第N次取不一樣,那就用起來很麻煩,需要記錄當(dāng)前是第幾次操作,這種需要記錄狀態(tài)的事情,可不是什么好事。
? ? ?B、對等性。若兩個對象equal方法返回為true,則其hash值也應(yīng)該是一樣的。舉例說明:若你將objA作為key存入HashMap中,然后new了一個objB。在你看來objB和objA是一個東西(因為他們equal),但是使用objB到hashMap中卻取不出來東西。
? ? ?C、互異性。若兩個對象equal方法返回為false,則其hash值最好也是不同的,但這個不是必須的,只是這樣做會提高hash類操作的性能(碰撞幾率低)。
?
3、Hash值應(yīng)該怎么計算?
? ?A、簡單計算就是組成成員的hash值直接相加即可。比如ObjectA有三個屬性,propA、propB和propC,最直接的計算方式就是propA.hashcode+propB.hashcode+propC.hashcode。
?
? ?B、但是如果遇到有順序相關(guān)的怎么辦?比如String類型是由char數(shù)組組成,并且這些數(shù)組是有順序的。如果使用第一種計算方法,則“ABCD”和“BCDA”就會產(chǎn)生同樣的hashCode,那么怎么辦呢?最直接想到的辦法就是加權(quán),不同的index加不同的權(quán)值,這個權(quán)值的確定最直接的方法就是某個常數(shù)值的幾次冪。比如為String的計算hash值為K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的選擇也有說法,最好不要是偶數(shù),因為偶數(shù)的相乘會造成信息的丟失(乘以2就是左移1位,一旦溢出就會造成信息的丟失,這種計算會造成溢出后的值與某個看似不相關(guān)的數(shù)值得到的結(jié)果是一樣的),所以最好是奇數(shù),在這一點上比較推薦使用7,因為7=8-1=2^3-1,這樣計算的時候,直接左移幾位再進行一次普通的加減法即可(Java中常用的是31(32-1=2^5-1))。
總結(jié)
以上是生活随笔為你收集整理的java中的hash值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: calcbusiness使用教程_cal
- 下一篇: java获取指定字符的hash值