2012-09-01 80 views
3

當編譯一小段Java代碼時,我收到一條有不安全操作的彙編註釋。我基本上只是希望如何改變我的數據結構的概念,以確保安全。Java不安全操作

概念:我需要根據輸入字符串的長度將輸入的字符串組織到一個桶中,這可能是任意的(儘管少於80個字符)。

驗證碼:

Map<Integer, List> buckets = new HashMap<Integer, List>(); 
      if(!buckets.containsKey(length)) 
      { 
       buckets.put(length,new Vector<wordValues>()); 
      } 
      //Now add the temp to the bucket 
      buckets.get(length).add(new wordValues(temp)); 

然後我的字符串添加到與它的尺寸列表。

什麼是更好的方法來做到這一點?

+0

看到這個答案:http://stackoverflow.com/questions/1792023/thread-safe-map-for-java –

+0

爲什麼'containsKey'和'get'? – oldrinb

回答

10

你混合原料和泛型列表,請嘗試:

Map<Integer, List<wordValues>> buckets = new HashMap<Integer, List<wordValues>>(); 

此外,通常的類名稱開頭大寫,例如WordValues

3

問題是您使用的是raw typeList而不是參數化的generic typeList<WordValues>。泛型在Oracle Java Tutorials中有廣泛的涵蓋。

Map<Integer, List<WordValues>> buckets = new HashMap<>(); 
... 
List<WordValues> values = buckets.get(length); 
if (values == null) { 
    values = buckets.put(length, new ArrayList<WordValues>()); 
} 
values.add(new WordValues(temp)); 

一些TID位:

  • containsKeyget都做相同的外觀起坐。這似乎有點奇怪做兩遍:-p
  • 避免使用Vector有利於ArrayList。如果您需要將其同步,請考慮通過Collections.synchronizedList進行裝飾。

    Collections.synchronizedList(new ArrayList<WordValues>()) 
    
  • Java 7支持類型參數推理,它可以顯着減輕您的負擔。注意上面我沒有輸入HashMap<Integer, List<WordValues>>;相反,我只是輸入HashMap<>,利用新的鑽石運營商
  • 避免使用以小寫字母開頭的類名;這通常很難閱讀(並針對Oracle Code Conventions)。考慮命名您的班級WordValues而不是wordValues