如何发送列表的值而不是引用(列表是地图的值)?

时间:2015-05-08 22:26:54

标签: java reference clone

我觉得我在参考VS值中遗漏了一些基本内容。在下面的代码中,getRecentProduct返回对列表的引用。

   public class ProductMapWrapper { 
    Map<String, List<ProductInformation>> productMap = new  HashMap<String, List<ProductInformation>>();

  public void putObject(ProductInformation productInfo, String key){
    List<ProductInformation> productInfoList = productMap.get(key);
    if (null == productInfoList)
        productInfoList = new ArrayList<ProductInformation>();
    productInfoList.add(productInfo);
    productMap.put(key, productInfoList);   
   }

  public ProductInformation getRecentProduct(String key){
    List<ProductInformation> productInfoList = productMap.get(key);
     productInfoList.get(0); //returns reference
    // the following is also returning reference
    List<ProductInformation> productinfoListCopy =  new ArrayList<ProductInformation>(productInfoList);
    return productinfoListCopy.get(0);
    }   
}
    // main function 
    ProductInformation productInfo = new ProductInformation();
    productInfo.setProdID("2323");
    ProductMapWrapper mapWrapper = new ProductMapWrapper();
    mapWrapper.putObject(productInfo, "MEDICAL");
    ProductInformation getObj =  mapWrapper.getRecentProduct("MEDICAL");
    System.out.println(getObj.getProdID());
    ProductInformation getObj1 =  mapWrapper.getRecentProduct("MEDICAL");
    getObj1.setProdID("test");
    System.out.println(getObj.getProdID()); // prints test

我遵循了不同的SO答案,并且大多数建议使用以下内容,但这也是返回参考。

  List<ProductInformation> productinfoListCopy =  new ArrayList<ProductInformation>(productInfoList);
    return productinfoListCopy.get(0);

克隆正在为我工​​作。但我想知道我在哪里失踪。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

您正在使用的代码会创建列表的副本,但它是“浅层副本”。这意味着它是一个不同的列表,但它仍然引用相同的对象。因此,如果您获得任一列表的第一个元素,那么您将获得对同一对象的引用。

你想要实现的是“深层复制”。你会在那里找到很多关于这个主题的信息 - 这是一个例子问题 - 它处理的是数组而不是列表,但它的原理相同,希望它是一些有用的阅读Deep copy of an object array