问题描述
使用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]}