当我尝试清除对象值时,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]}
我在使用 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]}