我觉得我在参考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);
克隆正在为我工作。但我想知道我在哪里失踪。有人可以帮忙吗?
答案 0 :(得分:2)
您正在使用的代码会创建列表的副本,但它是“浅层副本”。这意味着它是一个不同的列表,但它仍然引用相同的对象。因此,如果您获得任一列表的第一个元素,那么您将获得对同一对象的引用。
你想要实现的是“深层复制”。你会在那里找到很多关于这个主题的信息 - 这是一个例子问题 - 它处理的是数组而不是列表,但它的原理相同,希望它是一些有用的阅读Deep copy of an object array