当我尝试清除对象值时,LinkedHashMap 中的值被清除 (Java)

The value in LinkedHashMap cleared when I try to clear the object value (Java)

我在使用 LinkedHashMap 时遇到问题。我尝试在其中存储一些值,然后更新它。

我使用 String 作为键,使用 List 作为值。 我将 2 个值放在 List 上并将它们放入 LinkedHashMap。 下一步,我想更新 LinkedHashMap 中的一个值。 我清除列表并为其添加新值并更新 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);
    }
}

您的 collection 持有 test 的引用。从那以后,当 test 被清除时,您的 collection 将引用空列表。

如果您将 object 的浅表副本插入 collection,原始 object 的更改不会影响其副本。但是,引用指向某个内存段,而当它发生变异时,所有的变异都是可见的并且可以被引用访问。

更新: object 的更改是共享的,因为您修改的 object 与您在 collection.

中插入的相同 object

如果您克隆添加到地图中的列表,您将获得我认为的预期行为:

package Whosebug;

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, 900.0], TOST=[1598276243552, 900.0]}
{TPS=[], TEST=[1598276243552, 900.0], TOST=[1598276243552, 900.0]}
{TPS=[1598276243626, 200.0], TEST=[1598276243552, 900.0], TOST=[1598276243552, 900.0]}