前段时间,遇到个小问题,需求是这样的,找到商品名称相同的商品,于是,我就用了一个Map来装这些信息
Map<String, List<Product>> productMap = new HashMap<>();
然后写了一个for循环遍历product,如果商品名相同的话就放入到map的value中,代码如下(错误写法):
for (Product product : productList) {
//如果名字相同,则放入list中
if (productMap.get(product.getName()) != null) {
List<Product> tempProductList = productMap.get(product.getName());
tempProductList.add(product);
productMap.put(product.getName(), tempProductList);
} else {
productMap.put(product.getName(), Arrays.asList(product));
}
}
这里错就错在else语句中的Arrays.asList()上,当商品名不存在的时候,通过这个方法put到map中。当再次遇到这个商品名的时候,在tempProductList.add(product)这里会抛出一个UnsupportedOperationException异常。究竟是为什么呢?我们去看看源码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这里就是asList的源码,乍一看上去,似乎没有什么不对,但是当我们点击ArrayList的时候就会发现,这里的ArrayList不是java.util.ArrayList而是java.util.Arrays.ArrayList。也就是说,这里的ArrayList是Arrays的内部类,而这个内部类没有去实现add()方法,如下图所示
所以,它会去调用它父类java.util.AbstrastList的add()方法,而它父类的add()方法的源代码如下:
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
到这里,就很清楚了,父类的add()方法并没有实现,是留给子类自己去实现的,所以,这里抛出了一个UnsupportedOperationException异常。
下面附上正确的写法:
for (Product product : productList) {
//如果名字相同,则放入list中
List<Product> tempProductList = null;
if (productMap.get(product.getName()) != null) {
tempProductList = productMap.get(product.getName());
tempProductList.add(product);
productMap.put(product.getName(), tempProductList);
} else {
tempProductList = new ArrayList();
tempProductList.add(product);
productMap.put(product.getName(), Arrays.asList(product));
}
}