门户网站优化怎么做,桂林市网站建设,创建app需要什么条件,网站展现形式关于这个问题#xff0c;看了网上很多答案#xff0c;感觉都参差不齐#xff0c;没有答到要点#xff0c;这次就记录一下#xff01;
首先我们为什么要重写equals#xff1f;这个方法是用来干嘛的#xff1f;
public boolean equals #xff08;Object object#x…关于这个问题看了网上很多答案感觉都参差不齐没有答到要点这次就记录一下
首先我们为什么要重写equals这个方法是用来干嘛的
public boolean equals Object object{return (this obj);
} 上面是在Object类里面的定义可以看到它的作用仅仅是用来确认两个对象地址是否一样
那实际当中我们肯定不满足于这个方式啊我们一般是想知道两个对象里面的数据是否对的上
最直接的例子就是String这里官方给我们重写了equals方法从而使得我们在进行比较不同的string的时候比较的不是它们的地址而是字面值具体源码大家可以自己去看。
我这里也定义了一个类然后演示一下重定义equals前后的结果
public class People {private String name;public People(String name){this.namename;}public void setName(String name) {this.name name;}public String getName() {return name;}public String toString(){return Peopelname:name;}}public class a {public static void main(String[] args) {People hjnew People(wx);People nnnew People(wx);System.out.println(hj.equals(nn));}
}这是测试主类输出是false两个对象地址不一样当时输出false因为这个时候我们没有重写equals方法 但是实际当中我们当然期望是true因为这里两个对象里面属性是完全一样。
那么我们重写一下看看最后的结果 public boolean equals(Object obj) {if (this obj)return true;if (obj null)return false;if (getClass() ! obj.getClass())return false;People other (People) obj;if (name ! other.name)return false;if (name null) {if (other.name ! null)return false;} else if (!name.equals(other.name))return false;return true;} 上面是重写的方法具体的话大家自己看逻辑也很清楚 这次我们实现了输出true开心 --------------------------------------------------------------------------------------------------------------------------------至此我们搞懂了重写equals的目的
下面正式进入主题hashcode
首先定义一下hashcode它是一个函数将对象映射成一个整数
那么大家会说这个函数是什么
(165条消息) Java 的 HashCode 底层生成分析_董酷酷的博客-CSDN博客_hashcode底层
具体大家可以看这个链接给大家总结一下哈这个函数一般是伪随机数生成函数和对象地址是无关的除非你指定编译器参数 那么我们为啥要重写这个函数呢
让含有相同参数的对象 映射成相同的hashcode这句话很关键我下面的阐述都是基于此展开的
有人有会问为什么要映射成相同的hashcode呢那我举个最简单的例子吧
我现在有个hashmap对象为kv就是1
当你第一次 push一个对象参数是a后
第二次 push一个对象参数也是a
正常来说我们希望后面的put操作会覆盖前面的
但如果你不重写hashcode就不会实现覆盖map里会包含两个对象
这是因为hashmap put的原理是首先判断对象的hashcode如果不等直接判断为不同的key如果相等则执行equals方法来看是否相同
下面是代码
public class a {public static void main(String[] args) {HashMapPeople,Integer mapnew HashMap();People cxknew People(wx);map.put(cxk,1);People yyqxnew People(wx);map.put(yyqx,1);map.forEach((k,v)-{System.out.println(k);});}
}这是测试类最后结果是 那我们重写hashcode后 ok实际上重写hashcode主要保证的是一致性相同参数的对象映射到相同的hash值从而保证我们在集合里面能够正确的实现。