要让自定义对象作为hashmap的键正常工作,必须同时重写equals()和hashcode()方法;1. equals()和hashcode()需保持一致:相等的对象必须有相同的哈希码;2. 建议使用ide自动生成这两个方法以避免逻辑错误;3. 确保equals满足自反性、对称性、传递性和一致性;4. hashcode应使用所有参与equals比较的字段;5. 最好使用不可变对象作为键,防止状态改变导致哈希码变化;6. 高效的hashcode和equals实现可提升性能,必要时可缓存哈希码;7. 除hashmap外,hashset、linkedhashset等哈希基集合也需重写这两个方法;8. 在arraylist等集合中查找对象时,同样需要正确重写equals()方法,否则contains()等方法可能无法正常工作。

Java HashMap允许我们使用自定义对象作为键,但这其中隐藏着一些微妙的陷阱。简单来说,你需要确保你的自定义类正确实现了
equals()
hashCode()
解决方案:
要让自定义对象作为HashMap的键正常工作,必须同时重写
equals()
hashCode()
立即学习“Java免费学习笔记(深入)”;
equals()
hashCode()
equals()
hashCode()
以下是一个示例:
import java.util.Objects;
class MyKey {
private String name;
private int id;
public MyKey(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyKey myKey = (MyKey) o;
return id == myKey.id && Objects.equals(name, myKey.name);
}
@Override
public int hashCode() {
return Objects.hash(name, id);
}
@Override
public String toString() {
return "MyKey{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<MyKey, String> map = new HashMap<>();
MyKey key1 = new MyKey("Alice", 1);
MyKey key2 = new MyKey("Alice", 1);
MyKey key3 = new MyKey("Bob", 2);
map.put(key1, "Value for Alice 1");
System.out.println("Key1 hashcode: " + key1.hashCode());
System.out.println("Key2 hashcode: " + key2.hashCode());
System.out.println("Key1 equals Key2: " + key1.equals(key2));
System.out.println("Value for Key2: " + map.get(key2)); // 输出 "Value for Alice 1"
System.out.println("Value for Key3: " + map.get(key3)); // 输出 null
}
}在这个例子中,
MyKey
equals()
hashCode()
equals()
name
id
MyKey
hashCode()
Objects.hash()
name
id
如果不重写equals()
hashCode()
为什么需要同时重写
equals()
hashCode()
HashMap使用
hashCode()
equals()
equals()
hashCode()
get(key)
put(key, value)
自定义对象作为HashMap键时,如何避免常见的错误?
最常见的错误是忘记同时重写
equals()
hashCode()
equals()
hashCode()
equals()
为了避免这些错误,可以遵循以下建议:
equals()
hashCode()
equals()
equals()
hashCode()
equals()
equals()
hashCode()
使用自定义对象作为HashMap的键对性能有什么影响?
使用自定义对象作为HashMap的键对性能的影响取决于
equals()
hashCode()
以下是一些可以提高
equals()
hashCode()
equals()
equals()
Objects.hash()
除了HashMap,还有哪些数据结构需要重写
equals()
hashCode()
除了HashMap之外,HashSet和LinkedHashSet等基于哈希表的数据结构也需要重写
equals()
hashCode()
equals()
equals()
contains()
总而言之,理解
equals()
hashCode()
以上就是Java集合框架如何自定义对象作为HashMap的键_Java集合框架哈希键的正确实现技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号