3

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

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

有什么更好的方法来做到这一点?

4

2 回答 2

10

你混合原始和泛型列表,尝试:

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

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

于 2012-09-01T18:07:00.847 回答
3

问题是您使用的是原始类型 List而不是参数化泛型类型 List<WordValues>Oracle Java 教程中广泛介绍了泛型。

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));

一些花絮:

  • containsKey并且get两者都进行相同的查找。做两次似乎有点奇怪:-p
  • 避免使用Vector有利于ArrayList. 如果需要同步,请考虑通过Collections.synchronizedList.

    Collections.synchronizedList(new ArrayList<WordValues>())
    
  • Java 7 支持类型参数推断,可以显着减轻您的负担。注意上面我不必输入HashMap<Integer, List<WordValues>>;相反,我只是键入HashMap<>,利用新的菱形运算符
  • 避免使用以小写字符开头的类名;这通常很难阅读(并且违反了Oracle 代码约定)。考虑命名你的类WordValues而不是wordValues.
于 2012-09-01T18:59:04.783 回答