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

How to send value of a list instead of reference(where list is a value of a map)?

我觉得我在引用 VS values.In 下面的代码中遗漏了一些基本的东西,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);

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

您使用的代码创建了列表的副本,但它是 "shallow copy"。这意味着它是一个不同的列表,但它仍然引用相同的对象。因此,如果您获得任一列表的第一个元素,您将获得对同一对象的引用。

您想要实现的是 "deep copy"。您会在那里找到很多关于该主题的信息 - 这是一个示例问题 - 它处理数组而不是列表,但它是相同的原则,希望它是一些有用的阅读 Deep copy of an object array