编译一小段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 :(得分: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:
containsKey
和get
都会进行相同的查找。做两次似乎有点奇怪:-p 避免使用Vector
支持ArrayList
。如果您需要同步它,请考虑通过Collections.synchronizedList
进行装饰。
Collections.synchronizedList(new ArrayList<WordValues>())
HashMap<Integer, List<WordValues>>
;相反,我只是输入HashMap<>
,利用新的钻石运算符。WordValues
而不是wordValues
。