Java不安全操作

时间:2012-09-01 18:05:00

标签: java vector maps unsafe

编译一小段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));

然后我将字符串添加到与其大小相对应的列表中。

最好的办法是什么?

2 个答案:

答案 0 :(得分:10)

你混合raw和Generics List,试试:

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

此外,通常类名以大写字母开头,例如WordValues

答案 1 :(得分:3)

问题在于您使用的是raw type List而不是参数化的generic type List<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-bits:

  • containsKeyget都会进行相同的查找。做两次似乎有点奇怪:-p
  • 避免使用Vector支持ArrayList。如果您需要同步它,请考虑通过Collections.synchronizedList进行装饰。

    Collections.synchronizedList(new ArrayList<WordValues>())
    
  • Java 7支持类型参数推断,可以显着减轻您的负担。注意上面我没有输入HashMap<Integer, List<WordValues>>;相反,我只是输入HashMap<>,利用新的钻石运算符
  • 避免使用以小写字母开头的类名;这通常很难阅读(并且反对Oracle Code Conventions)。请考虑命名您的班级WordValues而不是wordValues