java - 当我尝试清除对象值时,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);
}
}
解决方案
您的收藏包含对 的引用test
。从那以后,当test
被清除时,您的集合将引用空列表。
如果将对象的浅表副本插入到集合中,则原始对象的更改不会影响其副本。但是,引用指向内存的某个片段,而当它发生突变时,所有的突变都是可见的,并且可以被引用访问。
UPD:对象的更改是共享的,因为您修改的对象与您在集合中插入的对象相同。
推荐阅读
- javascript - Google Apps 脚本 - 更新时将时间戳添加到多个单元格
- forms - 如何将 Mailerlite(或其他邮件服务)连接到 Google AMP 表单?
- java - 查找构成此字符串的代码的最小组合
- react-google-charts - 如何控制谷歌图表图例的字体系列、字体大小和颜色?
- javascript - 如何在VScode中调试Webdriverio黄瓜框架
- angular - 在嵌套元素中应用 searchPipe
- python - 如何在 discord.py 中删除 on_guild_remove(guild) 函数中的某些角色?
- react-native - 寻找用于启动屏幕动画过渡的 react-native 包
- azure - 无法更新 Web 应用设置:Web 工作人员的数量必须大于零
- java - 如何解决 spark-submit 错误:错误:加载类失败?