java - 带有类对象的哈希图
问题描述
我有一个 Test 类,它的具有相同值(101,“abc”)的对象被创建了两次。我将这两个对象作为键插入到 Hashmap 中。我想了解内部功能,为什么当我的两个键都相同时,我的大小变成了两个地图,它可能应该覆盖?
import java.util.HashMap;
import java.util.Map;
public class Test{
int id;
String name;
public static void main(String[] args) {
Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");
//Test e3 = new Test(101,"abc");
Map<Test, String> map = new HashMap<>();
map.put(e1, "XYZ");
map.put(e2, "CDF");
String value = map.get(e2);
System.out.println( "VALUE : "+value);
}
public Test(int id, String name) {
this.id = id;
this.name=name;
}}
解决方案
Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");
创建 2 个不同类型的Test对象。这意味着已为 e1 和 e2 分配了 2 个不同的内存空间。
现在让我们了解 map(比如 Hash Map)如何识别键的唯一性(用更简单的话说,映射如何知道您尝试插入的键是否已经存在)。答案是,map 调用 hashcode() 和 equals() 方法来比较 map 中存在的键与您尝试插入的键。
我们已经知道所有类都有一个默认的父类Object。并且Test类没有实现 hashcode() & equals(); 所以当map尝试调用它们时,对象类方法被调用了。由于 Object 的类 equals 仅当比较的两个对象都引用相同的对象引用时才返回true并且 hashcode() 也是如此,这里 e1 和 e2 显然是不同的对象。所以你有两个条目。
解决方案是按照上面@Kapil 的建议覆盖equals() 和hashcode()。
推荐阅读
- java - 使用等待和通知时如何修复 IllegalMonitorStateException?
- r - R 中预算分配的优化(以前的 Excel Solver)
- api - 带有 API 网关的微服务 OAuth - 架构
- oozie - 有没有办法让协调员复活?
- html - 引导指标编号,更改颜色
- keras - keras:set_weights() 不会改变值
- sql - 根据另一个过滤器的日期范围过滤结果
- sql - 数据上的 STUFF、UNPIVOT 和 group By 子句
- http - nginx 多个虚拟主机 - 错误 - 文件太多?
- php - 如果攻击者连续几天每毫秒重复向服务器发出请求,服务器会发生什么情况?