gpt4 book ai didi

带有整数键的 Java 映射 : How are the keys compared?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:44:48 28 4
gpt4 key购买 nike

我只想确保我的代码使用 Integer 对象作为键是安全的。这是一个简短的例子:

Integer int1 = new Integer(1337);
Integer int2 = new Integer(1337);

if (int1 == int2) {
System.out.println("true");
} else {
System.out.println("false");
}

if (int1.equals(int2)) {
System.out.println("true");
} else {
System.out.println("false");
}

Map<Integer, Object> map = new HashMap<Integer, Object>();
map.put(int1, null);
map.put(int2, null);

System.out.println(map.size());

代码会输出

false
true
1

这正是我所期待的,引用文献不同但彼此相同。现在我对 map 的行为很感兴趣。

  • 是否保证像 Map 或 Set 这样的集合会根据内容而不是引用来比较键?
  • 还是要看具体实现,比如HashMap

最佳答案

equals 方法被调用,因此比较的是内容。

关于你上面的两个问题:

给定两个对象 o1o2(为简化起见,我们假设 o1!=nullo2!=null), HashMap 最终必须确定它们是否具有相同的值。 (HashMap 还会检查 o1o2 是否具有相同的哈希值,但这在您的问题上下文中并不重要)。它通过调用方法 equals() 来实现。只要 o1.equals(o2) 为假,这两个对象就被 HashMap 认为是两个不同的键。

HashSet 还调用 equals() 来确定元素是否已包含在集合中,参见 http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add%28E%29 .

另一方面,

TreeMap 必须比较两个对象,并确定它们是否相等,或者哪个更大。它通过调用 compareTo() 来完成。因此,o1.compareTo(o2) 的返回值很重要(或者,如果您使用构造函数 http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html#TreeMap%28java.util.Comparator%29 创建了 TreeMap ,则使用比较器)。

因此保证的是,在HashMapHashSet中,使用方法equals()来区分对象,而在TreeMap,方法compareTo()。其他 Map 实现可能使用 ==(例如 IdentityHashMap)。

关于带有整数键的 Java 映射 : How are the keys compared?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13952579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com