日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中的hash值

發布時間:2024/1/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的hash值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、Hash值有什么用?

? ? ?HashMap、HashTable、HashSet,所以涉及到使用Hash值進行優化存儲的地方,都會用到HashCode。HashCode是Key,這種計算為提高計算的性能。想想看,一般來說,數組算是比較快的集合類了吧,直接用index定位元素,簡直就是O(1)的級別。但是添加元素就不這么樂觀了。但是使用hash類的集合,添加元素,移動的元素少,只影響一小塊,并且查找元素,由于hash值已經進行了定位分組,所以也會大大縮小涉及面,快速定位

?

2、Hash值應該符合什么原則?

? ? ?A、等冪性。不管執行多少次獲取Hash值的操作,只要對象不變,那么Hash值是固定的。如果第一次取跟第N次取不一樣,那就用起來很麻煩,需要記錄當前是第幾次操作,這種需要記錄狀態的事情,可不是什么好事。

? ? ?B、對等性。若兩個對象equal方法返回為true,則其hash值也應該是一樣的。舉例說明:若你將objA作為key存入HashMap中,然后new了一個objB。在你看來objB和objA是一個東西(因為他們equal),但是使用objB到hashMap中卻取不出來東西。

? ? ?C、互異性。若兩個對象equal方法返回為false,則其hash值最好也是不同的,但這個不是必須的,只是這樣做會提高hash類操作的性能(碰撞幾率低)。

?

3、Hash值應該怎么計算?

? ?A、簡單計算就是組成成員的hash值直接相加即可。比如ObjectA有三個屬性,propA、propB和propC,最直接的計算方式就是propA.hashcode+propB.hashcode+propC.hashcode。

?

? ?B、但是如果遇到有順序相關的怎么辦?比如String類型是由char數組組成,并且這些數組是有順序的。如果使用第一種計算方法,則“ABCD”和“BCDA”就會產生同樣的hashCode,那么怎么辦呢?最直接想到的辦法就是加權,不同的index加不同的權值,這個權值的確定最直接的方法就是某個常數值的幾次冪。比如為String的計算hash值為K^0*A.hashCode+K^1*B.hashCode+K^2*C.hashCode+K^3*D.hashCode。K的選擇也有說法,最好不要是偶數,因為偶數的相乘會造成信息的丟失(乘以2就是左移1位,一旦溢出就會造成信息的丟失,這種計算會造成溢出后的值與某個看似不相關的數值得到的結果是一樣的),所以最好是奇數,在這一點上比較推薦使用7,因為7=8-1=2^3-1,這樣計算的時候,直接左移幾位再進行一次普通的加減法即可(Java中常用的是31(32-1=2^5-1))。

總結

以上是生活随笔為你收集整理的java中的hash值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。