为什么要重写hashcode()
来源:互联网 发布:ios10不安全网络怎么连 编辑:程序博客网 时间:2024/06/07 18:13
前两天遇到一个面试官,问我重写equals()和hashcode()的问题。
equals()方法,我的理解是,通常情况与 “==”是相同的,即判断两个对象是否相等。如果有要判断对象内容是否相等的时候,则需要重写,例如String类。
但是面试官问我是否需要重写hashcode()的时候,我的第一反应是要重写,但是无法回答为什么要重写....(我仿佛记得书上写过?)
为什么要重写hashcode()?
答:在JAVA程序运行时,无论何时多次调用一个对象的hashcode方法,都必须返回相同的int值。
Java规定:如果两个对象相同,则它们的hashcode值一定相同。如果两个对象的hashcode值相同,它们并不一定相同。
如果两个对象的equals方法返回值为ture,则hashcode方法也必须返回相同;如果equals方法返回false,则hashcode返回值也必须不同。
这就可以解释,当重写euqlas()方法后,为什么要重写hashcode了:为了保证equals方法和hashcode方法的返回值一致。
这是在Set集合中定义的equals和hashcode()
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> { /** * Sole constructor. (For invocation by subclass constructors, typically * implicit.) */ protected AbstractSet() { } // Comparison and hashing public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Set)) return false; Collection<?> c = (Collection<?>) o; if (c.size() != size()) return false; try { return containsAll(c); } catch (ClassCastException unused) { return false; } catch (NullPointerException unused) { return false; } } public int hashCode() { int h = 0; Iterator<E> i = iterator(); while (i.hasNext()) { E obj = i.next(); if (obj != null) h += obj.hashCode(); } return h; }
更多细节,可以参考:
【http://blog.csdn.net/jing_bufferfly/article/details/50868266】
【http://blog.csdn.net/shiyanming1223/article/details/6893401】
阅读全文
0 0
- 为什么要重写hashcode()
- 为什么要重写hashcode() 方法
- 为什么要重写hashcode() 方法
- 为什么要重写hashcode() 方法
- 为什么要重写hashcode()方法
- 为什么要重写hashcode() 方法
- 为什么要重写hashcode()方法
- 为什么要重写hashcode() 方法
- 为什么要重写hashcode()方法
- 为什么要重写hashcode() 方法
- 为什么重写equals()也要重写hashCode()
- 为什么重写equals方法要重写hashCode
- hashCode 和 equals为什么要一起重写?
- 为什么要重写hashcode和equals方法
- 为什么要重写equals()和hashcode()
- 为什么要重写equals和hashCode方法
- 为什么要重写equals和hashcode方法
- java 为什么要重写hashcode方法
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
- Android动画总结
- 使用scrapy爬取拉勾网职位信息
- 在类中使用array_map()简单的递归过滤一些字符
- python学习——IO编程——文件读写
- 为什么要重写hashcode()
- EmberJS快速入门(二)
- Android6.0系统悬浮窗权限的问题解决方法
- qt sqlite数据库操作
- Java equals方法编写规范 —— 牢记这5条军规
- Information:Gradle tasks [:app:clean, :app:generateDebugSources和transformClassesWithJarMergingForDeb
- build cef 3.3029.1619.geeeb5d7
- JSP页面中插入css样式的三种方法
- JavaScript中的递归、PTC、TCO和STC