hashcode与equals
来源:互联网 发布:nginx默认安装路径 编辑:程序博客网 时间:2024/05/22 03:44
首先要知道hashcode是什么,百度百科里面这样解释道,hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。而且可以了解为什么要使用hashcode。这就要从集合讲起。Java中的集合(Collection)有两类,一类是List,再有一类是Set。 前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。 那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢? 这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。 也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
java定义的是,如果两个对象equals方法比较的是相等,那么他们的hashcode一定相同,但是如果他们的hashcode相同,那么equals方法返回的不一定是true。如何理解,若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
根据这两个规范,可以得到如下推论:
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
Java运行时环境是,先判断hashcode是否相等,再判断是否equals。
- hashcode()与equals()
- equals与hashcode
- equals与hashcode
- java--equals与hashcode
- hashcode()与equals()
- equals与hashcode
- equals与hashCode总结
- hashcode()与equals()
- equals与hashcode
- hashCode()与equals()方法
- 重写equals()与hashCode()
- 【java】equals()与hashCode()
- hashCode与equals方法
- hashCode与equals
- hashCode与equals详解
- 关于hashCode与equals
- equals() 与 hashcode()
- equals与hashCode
- 使用终端查看工程代码量
- MySQL 面试问题与解答
- spring重定向
- 流年清浅,静待花开
- hdu 3635 Disjoint并查集+路径压缩
- hashcode与equals
- WEB开发者必备的7个JavaScript函数
- Model-View-Controller
- linux64位Dr.com/吉大客户端
- spirng模型属性值的添加和获得user对象
- .Net 与TLS版本的兼容性
- 使用SliderLayout实现banner图片切换
- Java EE 及Jess安装
- python3 安装lxml 大坑