誤用ArrayListMultimap引發的問題


     最近生產環境的系統在運行一段時間后,用戶登錄速度越來越慢,但是重啟某一模塊后,用戶登錄恢復正常。如此反復,令人提心吊膽。於是下定決心,找出問題原因。

     趁着系統運行低峰期,打印出相應Dump文件,發現Dump文件中在ArrayListMultimap對象處包含大量HashMap$Entry,由於涉及信息安全,在這里就不粘貼其對應的Dump數據了。分析存在問題的代碼發現原作者引用了如下數據結構:

Multimap<Long,Long> syncMap = ArrayListMultimap.create();

    但是根據原代碼的業務邏輯,此處的(key,value )應當是不允許重復的。基於此分析,基本可以確定此處為對象誤用:將HashMultimap誤用為ArrayListMultimap.

     那么ArrayListMultimap與HashMultimap在對象去重上有啥區別呢?下面以示例來進行說明:

一、ArrayListMultimap存儲對象

Multimap<String,String> multimap= ArrayListMultimap.create();
multimap.put("Fruits","Banana");
multimap.put("Fruits","Apple");
multimap.put("Fruits","Apple");
int size=multimap.size();
#3
System.out.println(size);    
Collection<String> fruits = multimap.get("Fruits");
#[Banana,Apple,Apple]
System.out.println(fruits);  

 二、HashMultimap存儲對象

Multimap<String,String> multimap= HashMultimap.create();
multimap.put("Fruits","Banana");
multimap.put("Fruits","Apple");
multimap.put("Fruits","Apple");
int size=multimap.size();
#2
System.out.println(size);    
Collection<String> fruits = multimap.get("Fruits");
#[Banana,Apple]
System.out.println(fruits); 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM