如何发送列表的值而不是引用(其中列表是地图的值)?
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
我觉得我在引用 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