看think in java 4th持有对象一章的Map小结,因为一个例子,重新总结下hashCode()和equals(),加深印象。
来源:互联网 发布:ips独轮车软件 编辑:程序博客网 时间:2024/05/16 04:26
众所周之,String 、Math、还有Integer、Double。。。。等这些封装类重写了Object中的equals()方法,让它不再比较句柄(引用),而是比较对象中实际包含的整数的值,即比较的是内容。
结果:
value: [111, 123, 312]
b has:
111
c has:
123
a has:
312
没有重复 印证了上面的话一些封装类比较的是内容
而Object的equals()方法比较的是地址值。
同样看个例子 我们自定义类型
结果
People: [Person Marilyn, Person Luke, Person Luke, Person Kate]
Pets: [[Pug Louie aka, Cat Stanford, Cat Pinkola], [Rat Fuzzy, Rat Fuzzy], [Rat Fuzzy, Rat Fuzzy], [Cat Shackleton, Cat Elsie May, Dog Margrett]]
Person Marilyn has:
Pug Louie aka
Cat Stanford
Cat Pinkola
Person Luke has:
Rat Fuzzy
Rat Fuzzy
Person Luke has:
Rat Fuzzy
Rat Fuzzy
Person Kate has:
Cat Shackleton
Cat Elsie May
Dog Margrett
比较的是地址,出现了重复。
一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。
在java的集合中,判断两个对象是否相等的规则是:
首先,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
看下面的程序:
i
输出结果为:
1:zhangsan
1:zhangsan
3:wangwu
2:lisi
问题出现了,为什么hashset添加了相等的元素呢,这是不是和hashset的原则违背了呢?回答是:没有
因为在根据hashcode()对两次建立的new Student(1,"zhangsan")对象进行比较时,生成的是不同的哈希码值,所以hashset把他当作不同的对象对待了,当然此时的equals()方法返回的值也不等(这个不用解释了吧)。那么为什么会生成不同的哈希码值呢?上面我们在比较s1和s2的时候不是生成了同样的哈希码吗?原因就在于我们自己写的Student类并没有重新自己的hashcode()和equals()方法,所以在比较时,是继承的object类中的hashcode()方法,呵呵,各位还记得object类中的hashcode()方法比较的是什么吧!!
它是一个本地方法,比较的是对象的地址(引用地址),使用new方法创建对象,两次生成的当然是不同的对象了(这个大家都能理解吧。。。),造成的结果就是两个对象的hashcode()返回的值不一样。所以根据第一个准则,hashset会把它们当作不同的对象对待,自然也用不着第二个准则进行判定了。那么怎么解决这个问题呢??
答案是:在Student类中重新hashcode()和equals()方法。
例如:
根据重写的方法,即便两次调用了new Student(1,"zhangsan"),我们在获得对象的哈希码时,根据重写的方法hashcode(),获得的哈希码肯定是一样的(这一点应该没有疑问吧)。
当然根据equals()方法我们也可判断是相同的。所以在向hashset集合中添加时把它们当作重复元素看待了。所以运行修改后的程序时,我们会发现运行结果是:
1:zhangsan
3:wangwu
2:lisi
可以看到重复元素的问题已经消除。
- 看think in java 4th持有对象一章的Map小结,因为一个例子,重新总结下hashCode()和equals(),加深印象。
- 读书笔记 Think in Java 4th 第十一章 持有对象 List、Set、Queue和Map
- think in java第十一章持有对象 习题答案
- Think in Java(八):持有对象
- java--map容器的hashcode和equals
- Think in Java反刍笔记(6)---HashMap的工作原理-hashcode和equals原理的再次深入
- 总结Java equals()和hashCode()的联系
- 一个重写equals()和hashCode()方法的例子
- java.lang.Object的equals()和hashCode()方法小结
- 读书笔记 Think in Java 4th 第三章 操作符
- Think in Java学习总结(一)之对象
- 关于HashCode和Equals的小结
- 解析Java对象的equals()和hashCode()的使用
- 解析Java对象的equals()和hashCode()的使用
- 解析Java对象的equals()和hashCode()的使用
- 解析Java对象的equals()和hashCode()的使用
- 解析Java对象的equals()和hashCode()的使
- 解析Java对象的equals()和hashCode()的使用
- 小知识
- linux 性能检测 大多数性能检测信息都来自/proc
- [20110303]工作随笔
- 数据库
- LINUX 常见问题1000个详细解答
- 看think in java 4th持有对象一章的Map小结,因为一个例子,重新总结下hashCode()和equals(),加深印象。
- USB2.0速度识别
- How is i_is_deleted attribute used in version tree?
- 你好
- JavaScript 数据访问(翻译自High Performance Javascript 第二章)
- xml配置文件自动提示
- linux调试
- 大三第二学期开学总结
- Visual SVN的安装