hashmap == 菜鳥驛站?

柘一發表於2018-08-24

​ 在電商如此發達的社會,物流成為了重中之重的一環。之前在學校收快遞,都是自己在一堆快遞裡面找啊找,能找到也得花個三五分鐘,體驗非常不好。雙十一就更不用說了,就像尋寶一樣。現在阿里搞了個菜鳥,各個地方都有菜鳥驛站,負責攬件、收件、寄件,省時省力。菜鳥驛站每天那麼多快件,它是怎麼做到快速高效的管理的呢?

​ 首先讓我們還原收、取快遞的過程。

​ 首先,菜鳥驛站有非常多非常多的架子(1號架子、2號架子 … n號架子),架子上有一排位置負責存放快件。(非常類似於hashmap的陣列連結串列模型)

  1. 攬件: 當快遞來到驛站,管理員會檢視快遞的單號,選取單號的後四位作為key(為了買家方便,一般選取手機號後四位),以1234為例子。管理員會把1234放到1號架子上;如果快遞1235來了,也會放到1號架子上1234的後面;2234會放到2號架子上。
  2. 通知:把單號傳送給使用者通知來取件。
  3. 取件:使用者到了驛站,報手機號1234,管理員就會到1號架子上尋找快件。

整個過程就實現了攬件、取件的流程,十分像hashmap的put和get方法。

疑問:當驛站的快遞越來越多該怎麼辦呢?

當管理員發現快遞越來越多,多到每個架子上都有好多快遞,還是得找半天,甚至架子上都放不下了。管理員就多加1倍(甚至10倍)的架子,並給架子編號為1-1,1-2....。這樣,快遞1234就放在1-2號架子上,1345放在1-3號架子上。這樣不就好了嘛~

那我們回顧一下 菜鳥驛站跟hashmap的對應關係。

菜鳥驛站 hashmap
底層儲存 架子+架子上的位置 陣列連結串列(java1.8之後改為紅黑樹方便查詢)
put 攬件:根據手機尾號找到對應的架子並放在最後的位置上 根據hash值找到對應的陣列並放在連結串列的最後一個
get 取件:根據手機尾號找到對應的架子並一一比對找到對應的快遞 根據hash值找到對應的陣列,並在連結串列中找到eqals的值
擴容 架子不夠放,增加架子並重新編號 陣列增加一倍,並重新存放
hash碰撞 同一個手機號或者手機號前面兩位相同,所以放在了同一個架子上 hash值對應到了同一個陣列中

原來這就是菜鳥驛站(hashmap),演算法與生活果真是密不可分!

相關文章