why在重写equals时还必须重写hashcode方法分享
publicbooleanequals(ObjectanObject){
if(this==anObject){
returntrue;
}
if(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=count;
if(n==anotherString.count){
charv1[]=value;
charv2[]=anotherString.value;
inti=offset;
intj=anotherString.offset;
while(n--!=0){
if(v1[i++]!=v2[j++])
returnfalse;
}
returntrue;
}
}
returnfalse;
}
publicinthashCode(){
inth=hash;
if(h==0){
intoff=offset;
charval[]=value;
intlen=count;
for(inti=0;i<len;i++){
h=31*h+val[off++];
}
hash=h;
}
returnh;
}
那为什么在重写equals方法时都要重写equals方法呢:
首先equals与hashcode间的关系是这样的:
1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)
自我的理解:由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的
次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;
我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的
话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode
就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据
只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。
继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写
hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的
相关文章
- kindle联网异常的解决方法
- Java方法重写与重载的区别
- Java 关于重写compareTo方法
- java setproperty 未生效_Java System类setProperty()方法及示例[通俗易懂]
- 静态分析的四种基本方法是_比较静态均衡分析方法
- tostring方法怎么用_重写toString方法
- 【说站】java中方法重写的本质
- 【Java】重写equals方法
- 重写ThreadFactory方法和拒绝策略
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 实现 GroovyInterceptable 接口 | 重写 invokeMethod 方法 )
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法拦截 JDK 中已经定义的函数 )
- MongoDB Limit与Skip方法-7详解数据库
- MySQL小海豚:快速入门指南(mysql小海豚使用方法)
- 多个文件上传Linux SVN多个文件的简单方法(linuxsvn上传)
- 表关联查询:Oracle实现方法(oracle表关联查询)
- SQL Server中实现模糊查询的简单方法(sqlserver模糊查询)
- IIS6中.net项目伪静态重写路径的配置方法
- Linux服务器主从mysql数据库配置方法
- MySQL 中的不小于函数简介及使用方法(mysql不小于函数)
- Oracle提取年份和月份的简易方法(oracle中取年和月)
- 清除SQLServer日志的两种方法
- mysql同步复制搭建方法指南详细步骤
- ASP.NETURL伪静态重写实现方法
- Sqlfunction多行中的列合并为一行一列的方法
- linux下apache开启url重写的方法(详细说明)
- 用类的继承关系(重写父类的方法)实现简易后台代码模板
- c#重写TabControl控件实现关闭按钮的方法
- IIS7中Ajax.AjaxMethod无效的原因及解决方法
- 查找php配置文件php.ini所在路径的二种方法
- Java8新特性之默认方法(default)浅析
- PHP自动重命名文件实现方法