尝试清除对象值Java时,LinkedHashMap中的值已清除

问题描述

使用LinkedHashMap时出现问题。我尝试在其中存储一些值,然后对其进行更新。

我将String用作键,将List用作值。 我在List上放了2个值,然后将它们放到LinkedHashMap中。 下一步,我想更新LinkedHashMap中的值之一。 我清除了List并为其添加了新值,并更新了LinkedHashMap中的值。

但是发生一些奇怪的事情,当我清除List中的值时,LinkedHashMap中的值也被清除。

有人对这个问题有什么建议吗?

谢谢。

这是源代码

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class TestLinkedHash {

    private static LinkedHashMap<String,List<Object>> linkObj = new LinkedHashMap<String,List<Object>>();
    private static List<Object> test =  new ArrayList<Object>();
    
    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis();
        double value = 900.0;
        
        String key = "TPS";
        String key1 = "TEST"; 
        String key2 = "TOST";
        
        test.add(timestamp);
        test.add(value);
        
        linkObj.put(key,test);
        linkObj.put(key1,test);
        linkObj.put(key2,test);
        System.out.println(linkObj);    
        
        test.clear();
        System.out.println(linkObj);
        
        test.add(System.currentTimeMillis());
        test.add(200.0);
        linkObj.put(key,test);
        System.out.println(linkObj);
    }
}

解决方法

您的收藏夹包含对test引用。因此,清除test后,您的收藏夹将引用空白列表。

如果将对象的浅表副本插入集合中,则更改原始对象不会影响其副本。但是,引用指向的是内存的某个部分,而当它发生突变时,所有的突变都是可见的,并且可以被引用访问。

UPD: 对象的更改是共享的,因为您修改的对象与您在集合中插入的对象相同。

,

如果您克隆添加到地图的列表,您会得到预期的行为:

package stackoverflow;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;

public class TestLinkedHash {

    private static LinkedHashMap<String,List<Object>> linkObj = new LinkedHashMap<String,List<Object>>();
    private static List<Object> test = new ArrayList<Object>();

    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis();
        double value = 900.0;

        String key = "TPS";
        String key1 = "TEST";
        String key2 = "TOST";

        test.add(timestamp);
        test.add(value);

        linkObj.put(key,test);
        linkObj.put(key1,test.stream().collect(Collectors.toList()));
        linkObj.put(key2,test.stream().collect(Collectors.toList()));
        System.out.println(linkObj);

        test.clear();
        System.out.println(linkObj);

        test.add(System.currentTimeMillis());
        test.add(200.0);
        linkObj.put(key,test);
        System.out.println(linkObj);
    }
}

输出:

{TPS=[1598276243552,900.0],TEST=[1598276243552,TOST=[1598276243552,900.0]}
{TPS=[],900.0]}
{TPS=[1598276243626,200.0],900.0]}