Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象哈希映射内存/引用问题_Java_Android_Hashmap - Fatal编程技术网

Java 对象哈希映射内存/引用问题

Java 对象哈希映射内存/引用问题,java,android,hashmap,Java,Android,Hashmap,对于列表中的每个循环迭代,我都有一个。我将一个对象添加到另一个对象列表,然后修改该对象的值,然后添加到另一个列表 问题是,在添加到第二个列表之前修改对象后,第一个列表值也发生了更改 在整个项目中,我都面临着这种类型的引用/内存问题。在上一篇文章中,即使使用new关键字/addAll()etc方法复制列表数据,我也面临内存/引用问题 orderListNormal = new HashMap<>(); orderListDelete = new HashMap<>(); o

对于列表中的每个循环迭代,我都有一个
。我将一个对象添加到另一个对象列表,然后修改该对象的值,然后添加到另一个列表

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

在整个项目中,我都面临着这种类型的引用/内存问题。在上一篇文章中,即使使用new关键字/addAll()etc方法复制列表数据,我也面临内存/引用问题

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);

            }
    ......
    }
orderListNormal=newHashMap();
orderListDelete=新建HashMap();
OrderListXtra=新HashMap();
对于(整数哈希代码:
salesOrderList.keySet()){
OrderSalesModel order=salesOrderList.get(hashcode);
if(order.getQuantityAvailable()==0){
if(ISDirector){
processOrderListener.invalidQuantity();
返回;
}
double regular=order.getQuantity();
double extra=order.getQuantity()-order.getQuantityAvailable();
常规=常规-额外;
订单。设置数量(常规);
orderListNormal.remove(hashcode);
orderListDelete.put(hashcode,order);
order.setOrderDetailID(“0”);
订单。设置数量(额外);
put(hashcode,order);
}
......
}

如果不想对其进行变异,则应创建一个新的
OrderSalesModel
。由于您是通过使用
salesforderlist.get(hashcode)
获取
ordersalemodel
来保存引用,因此您将始终对其进行变异。制作一个复制构造函数并像这样使用它

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

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

A a = new A();
A b = a;
事实上,
a
b
都有相同的地址,当您更改
a
时,
b
将被更改。 必须使用
Clone
在Java中复制和复制对象
看看这个。

非常非常不清楚:如果它是一个列表,为什么您可以调用
keySet()
,然后使用hashcode调用
get()
?对不起,我们这里需要一个真正的。您只是发布了部分相关代码。我的猜测是:你并不总是“得到”不同的对象。但是,考虑到您的输入不足,没有人能够确定。从这个意义上说:查看您的命名:您可以根据“顺序”来确定“模型”类的所有实例;你称之为“列表”。。。那不是一张单子?!更新了HashMap的标题。再次提供一个。仅仅知道“这是一张地图”是不够的。认真地说:请研究我给你的链接,然后相应地改进你的问题。“你必须使用克隆”。不,你不能。完全不清楚OP到底在做什么。。。您的建议指出了一个选项是错误的,或者至少是非常误导的。在java中,除了复制构造函数之外,没有任何方法可以复制、修改复制的对象吗?如何解决将一个列表复制到另一个列表的相同问题?而不是猜测,对吗?你怎么知道,
OrderSalesModel
实际上有一个构造函数,它接受上述类的一个实例?@SadiqMdAsif这在很大程度上取决于你打算做什么。一般来说,您似乎缺乏关于java中引用和对象的非常基本的知识。在进行复杂的android任务之前,你应该先学习这些基础知识…@SadiqMdAsif对不起,我不明白你到底写了什么。但您可能想了解对象a=new Object();对象b=新对象(a);对象b=a.clone();有没有其他方法可以避免引用?我有很多课。为所有对象添加复制构造函数是不可行的。