㈠ java中hash是什麼意思
hash是一種演算法 就是數據結構中的散列表 既是一種查找方法,也是數據存儲方法,例如hashmap hashset
㈡ java:哈希表的原理與用法
Hashtable,原理嘛就不知道了。只知道說其是提供了兩個集合之間映射的能力,並且擁有每個元素的查詢時間近乎恆定的特性。兩個集合之間映射的能力,簡單的說,就是像是存放系統屬性的Properties類一樣(該類繼承自Hashtable),Properties類中將String映射到String,你可以用setProperty(String key, String value)把一對值對(key,value)存入Properties中,用getProperty(String key) 取得key對應的value值。用System.getProperties()你可以獲得一個系統屬性的哈希表,直接println出來你就可以看到整個哈希表所構成的集合了。第一個元素應該是java.runtime.name=Java(TM) SE Runtime Environment這個。這里你可以看得出"java.runtime.name"被映射到了"Java(TM) SE Runtime Environment"。在這里你也可以調用System.getProperties().getProperty("java.runtime.name")得到字元串"Java(TM) SE Runtime Environment"。這就是哈希表所提供的功能了,將一個元素映射到另一個元素,這之間的映射所構成的集合就是哈希表了。
你可以自己看看API文檔,裡面有詳細的解說,不過嘛,嘿嘿,中文版的那個翻譯啊,哎,慘不忍睹啊,感觸最多的是——主謂賓都難找啊。
㈢ 關於java的哈希值
HASH
是散列表的基礎計算方法,Java
內置了
hash
的支持,java.lang.Object
默認是通過對象在內存的地址計算出來的,所以每個對方都是唯一的
hash,但是當我們創建我們自己的對象類時,我們根據需要和業務邏輯來決定是否提供自己的
hashcode
和
equals
方法。
多個對象的
hash
可能重復,這是正常的,重復的對象在
hash
table
中是分配在同一個槽
(一個可以通過計算直接跳過那個位置的數組)中,會再通過
equals
對比
(在這個槽中的
hash
code
都相同的一個鏈表中逐一
equals
比較
key)
找到那個對象。
所以邏輯上是否相同是通過
equals
來計算的,而且
equals
相同的兩個對象,它們的
hash
也應該相同,如果你不能保證這點,那就說明你的
hashcode
和
equals
方法不是使用相同的演算法。
一個對象是否存在不是通過
hash
code
來判斷的,而是
equals。
a
==
b
的話,a.equals
(b)
肯定成立,但反過來就不一定。因為
a
==
b
比較的是對象的地址,只有同一個對象才能成立,equals
比較的是邏輯角度上的相等性。
看
String
或其它一個
JRE
自帶的類的
hashcode
和
equals
方法是怎麼做到的。
㈣ 關於java的哈希值
每個對象都有自己的哈希值,但並不是每次創建對象的時候都要判斷有沒有相同的對象,如果需要在程序運行中只有一個對象,那麼我們一般會使用單例模式類避免重復創建對象,每個對象都有一個hashCode()方法,比如integer a = 10;那麼a.hashCode();就是a對象的哈希值,能夠使用列印語句輸出。
㈤ JAVA中的HASHSET和HASHMap的底層實現是怎樣的大致講一下。
HASHMAP是根據HASH演算法儲存數據的集合類,每一個存入其中的對象都有一個特定的哈希值!當我們新建一個HashMap對象,如果不給定它的大小,其默認為16,就相當與下面新建了編號為0到15的數組(鏈表數組)。以默認HashMap為例,put一個對象時,首先得到他的哈希值,在與十五相除得到余數,找到與余數相同編號的數組插入其中!HASHSET就是沒有value值的HASHMAP,你可以新建一個HASHSET,插入0到15,絕對以0到15的順序列印。
㈥ JAVA中哈希碼具體是什麼
哈希其實只是一個概念,沒有什麼真實的指向。它的目的是保證數據均勻的分布到一定的范圍內。所以不同數據產生相同的哈希碼是完全可以的。
java中哈希一般是希望自己寫演算法的。隨便返回什麼都可以。如果什麼也不寫的話就會返回地址。如果自己寫,最簡單的做法是把所有欄位拼起一個長串做個hash值。
㈦ 詳解java中hashcode什麼時候用,怎麼用
有許多人學了很長時間的Java,但一直不明白hashCode方法的作用,
我來解釋一下吧。首先,想要明白hashCode的作用,你必須要先知道Java中的集合。
總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。
你知道它們的區別嗎?前者集合內的元素是有序的,元素可以重復;後者元素無序,但元素不可重復。
那麼這里就有一個比較嚴重的問題了:要想保證元素不重復,可兩個元素是否重復應該依據什麼來判斷呢?
這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那麼當元素很多時,後添加到集合中的元素比較的次數就非常多了。
也就是說,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。
於是,Java採用了哈希表的原理。哈希(Hash)實際上是個人名,由於他提出一哈希演算法的概念,所以就以他的名字命名了。
哈希演算法也稱為散列演算法,是將數據依特定演算法直接指定到一個地址上。如果詳細講解哈希演算法,那需要更多的文章篇幅,我在這里就不介紹了。
初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並不是)。
這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。
如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,
就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。
所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。
所以,Java對於eqauls方法和hashCode方法是這樣規定的:
1、如果兩個對象相同,那麼它們的hashCode值一定要相同;2、如果兩個對象的hashCode相同,它們並不一定相同 上面說的對象相同指的是用eqauls方法比較。
你當然可以不按要求去做了,但你會發現,相同的對象可以出現在Set集合中。同時,增加新元素的效率會大大下降。hashcode這個方法是用來鑒定2個對象是否相等的。 那你會說,不是還有equals這個方法嗎? 不錯,這2個方法都是用來判斷2個對象是否相等的。但是他們是有區別的。 一般來講,equals這個方法是給用戶調用的,如果你想判斷2個對象是否相等,你可以重寫equals方法,然後在代碼中調用,就可以判斷他們是否相等 了。簡單來講,equals方法主要是用來判斷從表面上看或者從內容上看,2個對象是不是相等。舉個例子,有個學生類,屬性只有姓名和性別,那麼我們可以 認為只要姓名和性別相等,那麼就說這2個對象是相等的。 hashcode方法一般用戶不會去調用,比如在hashmap中,由於key是不可以重復的,他在判斷key是不是重復的時候就判斷了hashcode 這個方法,而且也用到了equals方法。這里不可以重復是說equals和hashcode只要有一個不等就可以了!所以簡單來講,hashcode相 當於是一個對象的編碼,就好像文件中的md5,他和equals不同就在於他返回的是int型的,比較起來不直觀。我們一般在覆蓋equals的同時也要 覆蓋hashcode,讓他們的邏輯一致。舉個例子,還是剛剛的例子,如果姓名和性別相等就算2個對象相等的話,那麼hashcode的方法也要返回姓名 的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。 要從物理上判斷2個對象是否相等,用==就可以了。
㈧ java hash code 怎麼用啊
首先,想要明白hashCode的作用,你必須要先知道Java中的集合。
總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。你知道它們的區別嗎?前者集合內的元素是有序的,元素可以重復;後者元素無序,但元素不可重復。那麼這里就有一個比較嚴重的問題了:要想保證元素不重復,可兩個元素是否重復應該依據什麼來判斷呢?這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那麼當元素很多時,後添加到集合中的元素比較的次數就非常多了。也就是說,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。
於是,Java採用了哈希表的原理。哈希(Hash)實際上是個人名,由於他提出一哈希演算法的概念,所以就以他的名字命名了。哈希演算法也稱為散列演算法,是將數據依特定演算法直接指定到一個地址上。如果詳細講解哈希演算法,那需要更多的文章篇幅,我在這里就不介紹了。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並不是)。
這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。
所以,Java對於eqauls方法和hashCode方法是這樣規定的:
1、如果兩個對象相同,那麼它們的hashCode值一定要相同;
2、如果兩個對象的hashCode相同,它們並不一定相同
上面說的對象相同指的是用eqauls方法比較。
你當然可以不按要求去做了,但你會發現,相同的對象可以出現在Set集合中。同時,增加新元素的效率會大大下降。
㈨ java的LinkedHashSet是怎樣實現存取有序的, 底層原理是什麼
LinkedHashSet 的實現
對於 LinkedHashSet 而言,它繼承與 HashSet、又基於 LinkedHashMap 來實現的。
LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法操作上又與 HashSet 相同,因此 LinkedHashSet 的實現上非常簡單,只提供了四個構造方法,並通過傳遞一個標識參數,調用父類的構造器,底層構造一個 LinkedHashMap 來實現,在相關操作上與父類 HashSet 的操作相同,直接調用父類 HashSet 的方法即可。
需要注意理解的點是:
LinkedHashSet 是 Set 的一個具體實現,其維護著一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可為插入順序或是訪問順序。
LinkedHashSet 繼承與 HashSet,並且其內部是通過 LinkedHashMap 來實現的。有點類似於我們之前說的LinkedHashMap 其內部是基於 Hashmap 實現一樣,不過還是有一點點區別的(具體的區別大家可以自己去思考一下)。
如果我們需要迭代的順序為插入順序或者訪問順序,那麼 LinkedHashSet 是需要你首先考慮的。
㈩ java中hash函數都有什麼用啊
Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
HASH主要用於信息安全領域中加密演算法,他把一些不同長度的信息轉化成雜亂的128位的編碼里,叫做HASH值. 也可以說,hash就是找到一種數據內容和數據存放地址之間的映射關系
了解了hash基本定義,就不能不提到一些著名的hash演算法,MD5 和 SHA1 可以說是目前應用最廣泛的Hash演算法,而它們都是以 MD4 為基礎設計的。那麼他們都是什麼意思呢?
這里簡單說一下:
1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設計的,MD 是 Message Digest 的縮寫。它適用在32位字長的處理器上用高速軟體實現--它是基於 32 位操作數的位操作來實現的。
2) MD5
MD5(RFC 1321)是 Rivest 於1991年對MD4的改進版本。它對輸入仍以512位分組,其輸出是4個32位字的級聯,與 MD4 相同。MD5比MD4來得復雜,並且速度較之要慢一點,但更安全,在抗分析和抗差分方面表現更好
3) SHA1 及其他
SHA1是由NIST NSA設計為同DSA一起使用的,它對長度小於264的輸入,產生長度為160bit的散列值,因此抗窮舉(brute-force)性更好。SHA-1 設計時基於和MD4相同原理,並且模仿了該演算法。