Java 在 Map 中使用复杂数据类型作为 Key
2016-10-16 00:00
183 查看
有时候你想这么做:
但默认情况下这是不能成功的,因为在 HashMap 的实现中,是这么处理的:
注意,hashCode 相同,不一定 equals() 返回 true。
也就是说,我们要手动实现
大功告成。
Think in Java 中设计
自反性。
即
对称性。
若
传递性。
若
一致性。
对于
若
Map<User, Profile> map = new HashMap<>(); // 添加一些数据 map.put(new User(1), getProfile(1)); // 取用这些数据 if (map.containsKey(new User(1)) { doSomething(); }
但默认情况下这是不能成功的,因为在 HashMap 的实现中,是这么处理的:
// 代码有精简,改变了对 null 值的判断逻辑,不过这不是重点 if (key != null && e.hash == key.hashCode() && (e.key == key || key.equals(e.key)) { return e; }
注意,hashCode 相同,不一定 equals() 返回 true。
也就是说,我们要手动实现
equals()和
hashCode()才能达到我们的目的。
class User { private Integer id; @Override public int hashCode() { return this.id != null ? this.id : 0; } @Override public boolean equals(Object obj) { return obj instanceof User && (this.id.equals(((User) obj).id)); } }
大功告成。
Think in Java 中设计 equals()
的五条原则
自反性。即
x.equals(x)为 true
对称性。
若
x.equals(y)为 true,那么
y.equals(x)为 true
传递性。
若
x.equals(y)为 true 且
y.equals(z)为 true,那么
x.equals(z)也为 true
一致性。
对于
x.equals(y),只要判定信息不变,无论比较多少次结果均应相同。
若
x != null为 true,那么
x.equals(null)为 false
相关文章推荐
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- 使用用户自定义类型作为map的key
- java中map使用非系统类作为key
- java基础(三)------ java中的switch选择结构可以使用那些数据类型的数据作为表达式?
- 使用map来进行票数统计工作,循环输入多个人名,作为key存储到map中,对应的value就是该人获得的票数(即重复输入的次数),当重复输入时,需要对相应的数据进行修改。最红输quit结束循环,打印
- java中map使用非系统类作为key
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- Java新手备忘录[3]:复杂数据类型的比较
- 复杂数据类型使用基础
- 在asp.net AJAX客户端使用复杂数据类型方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法:服务器端和客户端数据类型的自动转换:复杂类型
- 在asp.net AJAX客户端使用复杂数据类型方法
- java中char数据类型的使用
- 使用java + oracle插入clob类型的数据
- [XMLer的生活]可使用基本类型作为键值的Java集合类-Trove 集合类
- 在asp.net AJAX客户端使用复杂数据类型
- key-list类型内存数据引擎介绍及使用场景
- Java复杂数据类型用法
- 使用ASP等客户端来访问Java的Web Service,取得复杂数据(DTO)