【Java】Map杂谈,hashcode()、equals()、HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap
2016-05-13 00:07
555 查看
参考的优秀文章:
《Java编程思想》第四版
《Effective Java》第二版
Map接口是映射表的结构,维护键对象与值对象的对应关系,称键值对。
在HashMap或类似的实现中,查找一个对象,是通过hashcode()返回的散列值映射到一个范围内的下标,在通过equals()比较此下标连接的链表是否存在相同的对象。
简单来说,hashcode()用于参考、快速定位(缩减范围),真正是否等于是依赖equals()。
默认的hashcode()和equals()
如何对象没有覆盖这两个方法,那么就是继承Object对象的。
在Object中,hashcode()是使用对象的地址计算散列值;equals()只比较对象的地址。
必要的时候,我们需要覆盖这两个方法。
覆盖这两个方法有什么原则呢?
equals()的覆盖,主要是基于此对象的业务。
而hashcode()的覆盖原则,详情可参见《Effective Java》的“覆盖equals时总要覆盖hashcode”一节。
有几个比较重要的原则:
1、两个equals相等的对象,其hashcode是相等的。
2、两个equals不等的对象,其hashcode有可能是相等的。
3、好的hashcode()应产生分布均匀的散列码。
基于第3点,《Effective Java》有具体的建议。
1、定义变量result为非零的数。
2、用公式result = 31 * result + c,其中c是类中各个域的散列值。
用Eclipse生成的hashcode()与此原则类似,我们可以看看:
View Code
《Java编程思想》第四版
《Effective Java》第二版
Map接口是映射表的结构,维护键对象与值对象的对应关系,称键值对。
> hashcode()和equals()
hashcode()和equals()即用于识别对象的身份。在HashMap或类似的实现中,查找一个对象,是通过hashcode()返回的散列值映射到一个范围内的下标,在通过equals()比较此下标连接的链表是否存在相同的对象。
简单来说,hashcode()用于参考、快速定位(缩减范围),真正是否等于是依赖equals()。
默认的hashcode()和equals()
如何对象没有覆盖这两个方法,那么就是继承Object对象的。
在Object中,hashcode()是使用对象的地址计算散列值;equals()只比较对象的地址。
必要的时候,我们需要覆盖这两个方法。
覆盖这两个方法有什么原则呢?
equals()的覆盖,主要是基于此对象的业务。
而hashcode()的覆盖原则,详情可参见《Effective Java》的“覆盖equals时总要覆盖hashcode”一节。
有几个比较重要的原则:
1、两个equals相等的对象,其hashcode是相等的。
2、两个equals不等的对象,其hashcode有可能是相等的。
3、好的hashcode()应产生分布均匀的散列码。
基于第3点,《Effective Java》有具体的建议。
1、定义变量result为非零的数。
2、用公式result = 31 * result + c,其中c是类中各个域的散列值。
用Eclipse生成的hashcode()与此原则类似,我们可以看看:
LinkedHashMap 根据插入顺序排列: {k0=v0, k1=v1, k2=v2, k3=v3, k4=v4, k10=v10, k9=v9, k8=v8, k7=v7, k6=v6} {k0=v0, k1=v1, k2=v2, k3=v3, k4=v4, k10=v10, k9=v9, k8=v8, k7=v7, k6=v6} LinkedHashMap 根据最近最少使用(Least Recently Used)顺序排列: {k0=v0, k1=v1, k2=v2, k3=v3, k4=v4, k10=v10, k9=v9, k8=v8, k7=v7, k6=v6} {k0=v0, k1=v1, k2=v2, k3=v3, k4=v4, k9=v9, k8=v8, k7=v7, k6=v6, k10=v10}
View Code
相关文章推荐
- java技术路线
- struts2中关于传值问题
- json+struts2
- springMvc小案例
- Struts原理
- 【好】Java 类中各成分加载顺序 和 内存中的存放位置
- Java:快速排序(双指针版)
- Java:冒泡排序
- Java:快速排序(单指针)
- 基于内积法的Hadoop的MapReducer框架实现稀疏矩阵乘法(java)
- Spring MVC @ModelAttribute
- spring容器问题:解决图片服务器地址无法解析
- java 随机数,剩余数
- 《Java编程思想》第四版读书笔记 第八章 多态
- Java文件下载
- springMVC 返回类型选择 以及 SpringMVC中model,modelMap
- 解决building workplace 导致的卡死,使得eclipse加速
- 导入Android Studio 项目报 invalid gradle jdk configuration found
- 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类
- [javaSE] 集合框架(TreeSet)