当前位置: 首页 > news >正文

正定县建设局网站app优化

正定县建设局网站,app优化,网站建设宣传,免费制作音乐的软件app判断是否是相同对象时,hashcode和equals方法的调用顺序 先调用hashcode()方法,再调用equals()方法如果hashcode()方法得到的哈希值不同,那么两个对象一定不相同,不作后续判断如果hashcode()方法得到的哈希值相同,那么…

判断是否是相同对象时,hashcode和equals方法的调用顺序

  • 先调用hashcode()方法,再调用equals()方法
  • 如果hashcode()方法得到的哈希值不同,那么两个对象一定不相同,不作后续判断
  • 如果hashcode()方法得到的哈希值相同,那么还得判断equals()方法,根据equals()方法的返回值来具体判断两个对象是否相同
  • 为什么哈希值相同,还得再判断equals方法?
    可以去看一下我写的一般哈希 思想与模板代码 理解一下哈希的实现思路
    可以发现会产生hash冲突的现象,即可能有几个key被存在了相同的hash位置,这时候仅凭借hash值是否相等,不能判断两个对象是否相等,这时候还得根据equals()方法来验证判断下,可以理解为一个双保险。

如果想做一些特殊的去重操作,不同于一般的去重,该怎么有效利用hashcode和equals方法?

这里我给出自己在本科毕业设计中的一个样例。

问题需求

我想在HashSet中存放一个类Comparison,这个类的属性有两个对象se1se2和他们之间的名称相似度NameSimilarity和类别相似度CategorySimilarity

public class Comparison{private SE se1;     //实体1private SE se2;     //实体2private double NameSimilarity;        //名称相似度private double CategorySimilarity;    //类别相似度public Comparison(SE se1, SE se2, double nameSimilarity, double categorySimilarity) {this.se1 = se1;this.se2 = se2;NameSimilarity = nameSimilarity;CategorySimilarity = categorySimilarity;}
}

然后,定义两个Comparison对象怎么才算重复呢?
如果一个Comparison对象拥有实体(se1,se2),另一个Comparison对象拥有(se2,se1)(se1,se2),则这两个Comparison对象被认为是重复的,即交换对象里的两个SE对象的位置仍然算是一个Comparison对象

重写hashcode和equals方法

 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Comparison that = (Comparison) o;return Double.compare(that.NameSimilarity, NameSimilarity) == 0 && Double.compare(that.CategorySimilarity, CategorySimilarity) == 0&& ( (se1.equals(that.se1)&&se2.equals(that.se2)) || (se1.equals(that.se2)&&se2.equals(that.se1)) );
}@Overridepublic int hashCode() {return Objects.hash(se1, se2, NameSimilarity, CategorySimilarity);//return Objects.hash(se1) + Objects.hash(se2) + Objects.hash(NameSimilarity, CategorySimilarity);// 让se1和se2的顺序对hash值没有影响就行
}

equals方法中的( (se1.equals(that.se1)&&se2.equals(that.se2)) |(se1.equals(that.se2)&&se2.equals(that.se1)) )描述了上述逻辑。
但是发现这样写,仍然不对,没发发掘交换位置的情况,原来是因为交换位置后,Objects.hash(se1, se2, NameSimilarity, CategorySimilarity);算出来的hashcode完全不一样了,根据前面讲的逻辑,一旦hashcode不一样,就不会再去判断equals方法。

优化

 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Comparison that = (Comparison) o;return Double.compare(that.NameSimilarity, NameSimilarity) == 0 && Double.compare(that.CategorySimilarity, CategorySimilarity) == 0&& ( (se1.equals(that.se1)&&se2.equals(that.se2)) || (se1.equals(that.se2)&&se2.equals(that.se1)) );
}@Overridepublic int hashCode() {//return Objects.hash(se1, se2, NameSimilarity, CategorySimilarity);return Objects.hash(se1) + Objects.hash(se2) + Objects.hash(NameSimilarity, CategorySimilarity);// 让se1和se2的顺序对hash值没有影响就行
}
return Objects.hash(se1) + Objects.hash(se2) + Objects.hash(NameSimilarity, CategorySimilarity);

这样写,可以让se1和se2的顺序对hash值没有影响,但也没有影响性能,也没有丧失hashcode的效果。

http://www.tj-hxxt.cn/news/12081.html

相关文章:

  • 无水印效果图网站如何搭建公司网站
  • 门户网站 技术方案今日特大新闻新事
  • 软件研发和开发哪个工资高安卓优化大师全部版本
  • 广州网站制作武汉永久免费进销存管理软件手机版
  • 惠州网站制作定制宁德市疫情
  • 南昌市 做网站的公司无人在线观看高清视频单曲直播
  • 网站建设的一般步骤包含哪些查收录网站
  • 外贸怎么做网站搜外网友情链接
  • vs2013怎么做网站百度seo优化排名如何
  • 做网站只做前端可以用吗seo推广优化外包公司
  • 最大的房产网站网络营销成功的案例分析
  • 文山做网站yunling88朝阳seo
  • 杭州网站设计的公司苏州推广排名
  • 沈阳网站设计营销型昆明百度推广开户费用
  • 免费建站网站一级 熟熟俱乐 一级夫妇性活 五月天噪综合常德网站优化公司
  • 工程信息网站哪家做的较好郑州网络推广哪个好
  • 网页设计欣赏及点评seo权重查询
  • 设计师网站导航青年帮武汉百度推广代运营
  • 石家庄网站建设系统百度网盘搜索引擎网站
  • 为什么使用html5网站互联网优化
  • 2022年中国企业500强名单seo百度网站排名研究中心关键词首页优化
  • 怎么做企业网站产品营销方案案例范文
  • 做网站用jsp还是html怎样推广小程序平台
  • 行政单位单位网站建设长沙网站优化公司
  • 站长平台有哪些就在刚刚武汉宣布最新消息
  • win7网站服务器制作软件制作网站需要什么技术
  • 网站建设和维护价格广东省新闻
  • 如何做某网站的移动客户端开发seo网站技术培训
  • 小语种网站案例市场营销一般在哪上班
  • 网站建设合同广点通和腾讯朋友圈广告区别