我有一个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)
上面的结果将打印“唯一”,但我认为应该打印“重复”。为什么以上结果显示了这一点?
由于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查找逻辑将无法工作。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |