我正在尝试将 HashMap 和 Hastable 与对象列表一起用作键。 请在下面查看我的代码的简化版本,该版本不起作用。 当我调试这段代码时,我希望 TestMap4 对象中有 3 个项目,但只有 1 个。
List<String> lst = new ArrayList<>();
lst.add("Hello");
lst.add("World");
Map<List<String>, Integer> testMap4 = new HashMap<List<String>, Integer>();
testMap4.put(lst, 1);
testMap4.put(lst, 2);
testMap4.put(lst, 5);
当我将新项目放入 HashMap 对象时会发生什么?为什么它不起作用?
我在下面的这个新示例中获得了相同的结果。 (每个列表计数相同的 2 个字符串)
List<String> lst = new ArrayList<>();
lst.add("Hello");
lst.add("World");
List<String> lst2 = new ArrayList<>();
lst2.add("Hello");
lst2.add("World");
List<String> lst3 = new ArrayList<>();
lst3.add("Hello");
lst3.add("World");
Map<List<String>, Integer> testMap4 = new HashMap<List<String>, Integer>();
testMap4.put(lst,1);
testMap4.put(lst2,2);
testMap4.put(lst3,5);
如果我只修改 2 个字符串的 1 个字符,这没问题
最佳答案
你不懂HashMap
的概念.
您的问题是您每次都使用相同的 key 。
testMap4.put(lst, 1); // <----same key, different value
testMap4.put(lst, 2); // <----same key, different value
testMap4.put(lst, 5); // <----same key, different value
在Hashmap
,存储在 Hashmap
中的每个值, 有一个 key
与该特定值一起保存并且对于存储在 Hashmap
中的每个值都是唯一
关于 HashMap
的要点:
1- HashMap 包含基于键的值。
2- 它只包含独特的元素。
3- 它可能有一个空键和多个空值。
4- 它没有秩序。
示例
HashMap<Integer,String> hm = new HashMap<>();
其次,如果任何列表在插入映射后被修改,使用可变对象(List<>
)作为键会导致未定义的行为。哈希码根据合约计算为List
(请参阅 Javadoc)仅当条目首次插入 map 时。更改列表内容将更改哈希码,您将无法再找到该条目。
使用 List<>
(或任何可变对象)作为 HashMap<>
中的键是一个非常糟糕的主意™。
关于Java - 使用 HashMap 和 List<> 作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182116/