检测HashMap包含或不包含相同List的更好方法

Jas*_*son 3 java list hashmap

我有一个List将随时间更改的值,我想将其与时间值一起存储,并检查是否List再次出现该值。

例如:

[1, 2, 3] is same as [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我认为既然List<Integer>是通过参考值传递的,所以我认为应该将键字符串化以使用。

例如:

Map<String, Integer> = new HashMap<>()
(key:"stringified key", value: .....)
Run Code Online (Sandbox Code Playgroud)

但是我发现它Map<List<Integer>, Integer> map = new HashMap<>()也可以工作,但是我不知道它为什么起作用,因为无论列表中的值发生了什么变化,键都应该引用相同的列表。

例如:

(key:[reference to key], value: .....)
List<Integer> testList = new ArrayList<>();
testList.add(0);
map.put(testList, 0);
testList.set(0, 1);
if(map.containsKey(testList))System.out.println("duplicate");
else System.out.println("unique");
Run Code Online (Sandbox Code Playgroud)

上面的结果将打印“唯一”,但我认为应该打印“重复”。为什么以上结果显示了这一点?

Kar*_*cki 5

由于yoy更改了内容ArrayList的值,因此ArrayList hashCode也更改了。

List<Integer> l = new ArrayList<>();
l.add(0); 
System.out.println(l.hashCode()); // 31
l.set(0, 1);
System.out.println(l.hashCode()); // 32
Run Code Online (Sandbox Code Playgroud)

这违背了原则HashMap,其中hashCode用于查找元素的位置。用于HashMap键的对象应该具有常量hashCode,否则HashMap查找逻辑将无法工作。