在電商如此發達的社會,物流成為了重中之重的一環。之前在學校收快遞,都是自己在一堆快遞裡面找啊找,能找到也得花個三五分鐘,體驗非常不好。雙十一就更不用說了,就像尋寶一樣。現在阿里搞了個菜鳥,各個地方都有菜鳥驛站,負責攬件、收件、寄件,省時省力。菜鳥驛站每天那麼多快件,它是怎麼做到快速高效的管理的呢?
首先讓我們還原收、取快遞的過程。
首先,菜鳥驛站有非常多非常多的架子(1號架子、2號架子 … n號架子),架子上有一排位置負責存放快件。(非常類似於hashmap的陣列連結串列模型)
- 攬件: 當快遞來到驛站,管理員會檢視快遞的單號,選取單號的後四位作為key(為了買家方便,一般選取手機號後四位),以
1234
為例子。管理員會把1234
放到1
號架子上;如果快遞1235
來了,也會放到1號架子上1234
的後面;2234
會放到2號架子上。 - 通知:把單號傳送給使用者通知來取件。
- 取件:使用者到了驛站,報手機號
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),演算法與生活果真是密不可分!