話說回來,這個例子要讓Java比Python跑得快無需修改代碼,只要稍微修改壹下Java的啟動參數即可。另外我也相信這個小例子不壹定充分反映了題主說的“需要3個小時以上”的那個Java程序的性能問題。那個程序或許也只需要稍微調整壹下啟動參數就可以大幅提高性能,也可能要修改代碼去掉壹些不好的做法。
所以具體到題主這個例子,是什麽造成Java比Python慢得多?是HashMap寫得沒dict好?是因為HashMap用Java實現而dict用C實現?是因為JIT的預熱開銷?還是別的?
假定題主運行Java和Python的環境都是常見的,例如說Oracle JDK vs 原裝CPython,那麽在Java壹側討論的對象就是Oracle JDK裏的HotSpot VM的性能。
答案是:是因為題主沒有設置好GC的參數,而HotSpot VM默認的GC參數在這個例子上非常不適用,導致默認參數下Java版的性能非常糟糕。Java的HashMap自身並不慢,特別是經過JIT編譯後它其實不會比CPython的dict慢,至少不是造成這個例子的性能差異的原因。