java - 自定义对象作为 HashMap 中的键
问题描述
众所周知,我们可以使用任何 Object 作为 Java HashMap 中的键,只要它遵循 equals 和 hashCode 协定。但是我在某处读过它——如果自定义对象是不可变的,那么这已经被处理了。这是否意味着如果我的自定义对象是不可变的,我不需要重写 hashcode 和 equals 方法以使其有资格将其用作我的 hashmap 的键。
我的理解是这是错误的,即使我的自定义对象是不可变的,它也必须重写 hashcode 和 equals 方法才能使其符合 hashmap 键的条件。如果你们有不同的看法,请发表评论。
解决方案
构造地图不会有问题,而且你的每一个条目,除非对象的哈希码碰撞将是唯一的。但是基于键的搜索将是一个问题。由于它是不可变的,因此您确实无法创建可以匹配地图中的键的键。
{
HashMap<ImmutableKey, String> map = new HashMap<>();
ImmutableKey key = new ImmutableKey("A", "B");
map.put(key, "Test");
map.put(new ImmutableKey("A", "B"), "Test1");
map.put(new ImmutableKey("A", "B"), "Test2");
map.put(new ImmutableKey("A", "B"), "Test3");
System.out.println(map);
String data = map.get(new ImmutableKey("A", "B"));
System.out.println(data);
}
final class ImmutableKey {
private String key;
private String value;
public ImmutableKey(String key, String value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
}
推荐阅读
- r - geom_bar 如何使多个系列不堆叠
- java - 如何从数组或列表中删除两个元素的序列?
- c - 错误:使用无效的预处理令牌形成粘贴
- python - 'ImageDataGenerator' 对象没有属性 'image_data_generator'
- android - gradle 如何确定从哪个存储库安装?
- forms - access 2016:使用 Alt+Tab 在打开的表单之间切换
- php - 带有恶意代码的 Joomla K2 页面
- html - Google Chrome / macOS:密码字段不接受非 ASCII 字符
- django - 如何在 django REST 框架中返回模型的所有图像
- amazon-web-services - 如何使用我当前的代码将下载文件上传到亚马逊 s3 存储桶