Arrays.asList问题

    前段时间,遇到个小问题,需求是这样的,找到商品名称相同的商品,于是,我就用了一个Map来装这些信息

Map> productMap = new HashMap<>();

    然后写了一个for循环遍历product,如果商品名相同的话就放入到map的value中,代码如下(错误写法):

for (Product product : productList) {
                //如果名字相同,则放入list中
                if (productMap.get(product.getName()) != null) {
                    List 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  List asList(T... a) {
        return new ArrayList<>(a);
    }

    这里就是asList的源码,乍一看上去,似乎没有什么不对,但是当我们点击ArrayList的时候就会发现,这里的ArrayList不是java.util.ArrayList而是java.util.Arrays.ArrayList。也就是说,这里的ArrayList是Arrays的内部类,而这个内部类没有去实现add()方法,如下图所示


Arrays.ArrayList

所以,它会去调用它父类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 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));
                }
            }

你可能感兴趣的:(Arrays.asList问题)