对象HashMap内存/引用问题

时间:2017-10-24 11:18:59

标签: java android hashmap

我在列表中进行了for each loop迭代。我将一个对象添加到另一个对象列表然后我修改对象的值然后我添加到另一个列表。

问题是在添加到第二个列表之前修改对象后,第一个列表值也发生了变化。

我在整个项目中都面临着这种类型的引用/内存问题。在之前的版本中,即使我使用新的Keyword / addAll()等方法来复制列表数据,我也面临内存/引用问题。

orderListNormal = new HashMap<>();
orderListDelete = new HashMap<>();
orderListExtra = new HashMap<>();

for (Integer hashcode :
                salesOrderList.keySet()) {

            OrderSalesModel order = salesOrderList.get(hashcode);

            if (order.getQuantityAvailable() == 0) {
                if (isDirectOrder) {
                    processOrderListener.invalidQuantity();
                    return;
                }
                double regular = order.getQuantity();
                double extra = order.getQuantity() - order.getQuantityAvailable();
                regular = regular - extra;

                order.setQuantity(regular);
                orderListNormal.remove(hashcode);
                orderListDelete.put(hashcode, order);

                order.setOrderDetailID("0");
                order.setQuantity(extra);
                orderListExtra.put(hashcode, order);

            }
    ......
    }

2 个答案:

答案 0 :(得分:1)

如果你不想改变它,你应该创建一个新的OrderSalesModel。由于您通过OrderSalesModel获取salesOrderList.get(hashcode)来保持参考,因此您将始终改变它。制作一个复制构造并像这样使用它

OrderSalesModel order = new OrderSalesModel(salesOrderList.get(hashcode));

答案 1 :(得分:1)

您必须克隆您的对象。当你这样做时:

A a = new A();
A b = a;

事实上,当您更改a时,ba会有相同的地址,b会被更改。 您必须使用Clone在Java中复制和对象 看一下这个Tuto