首页 > 解决方案 > 当我尝试清除对象值时,LinkedHashMap 中的值被清除(Java)

问题描述

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

我使用 String 作为键,使用 List 作为值。我在 List 上放了 2 个值并将它们放入 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);
    }
}

标签: javalistlinkedhashmap

解决方案


您的收藏包含对 的引用test。从那以后,当test被清除时,您的集合将引用空列表。

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

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


推荐阅读