企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png) [TOC] ## 1、一些概念: 1. 若 `==` 两侧都是基本数据类型,则判断的是左右两边操作数据的值是否相等 2. 若 `== `两侧都是引用数据类型,则判断的是左右两边操作数的内存地址是否相同。若此时返回 `true` , 则该操作符作用的一定是同一个对象。 3. `Object` 基类的 `equals` 默认比较两个对象的内存地址,在构建的对象没有重写 `equals` 方法的时候,与 `==` 操作符比较的结果相同。 4. `equals` 用于比较**引用数据类型**是否相等。在满足`equals` 判断规则的前体系,两个对象只要规定的属性相同我们就认为两个对象是相同的,比如 String 就重写了 equals 方法,所以可以用 equals 去实现比较字符串是否相等 ![](https://img.kancloud.cn/6e/62/6e62dc790330a36c571f5799cf448e41_1314x736.png) ## 2、hashCode 方法返回的是对象的内存地址么? `Object` 基类的 `hashCode` 方法默认返回对象的内存地址,但是在一些场景下我们需要覆写 `hashCode` 函数,比如需要使用 `Map` 来存放对象的时候,覆写后 `hashCode` 就不是对象的内存地址了。 在 String 类中,就提供了重写的 hashCode 方法,如下: ```java public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; } ``` 可以看到,在 String 类的 hashCode 方法中,会针对当前的 String 字符串计算出唯一的 hash 值。 ## 3、为什么一般重写equals 方法 也会重写 hashcode 方法 因为在使用 hashmap 的时候,会先根据 key 值得 hashCode 方法计算出 hash 值,确定该元素在数组中的位置,如果数组中不存在该值,那么就直接把元素的 key 放进数组,代表了元素的插入。 如果数组中存在该 key 的 hashCode ,那么就会遍历链表,遍历链表的时候使用的是元素 key 值的 equals 方法去判断是否相等的, 如果相等用新的 value 取代旧的 value 那么问题来了? 如果不重写 hashCode 方法,那么就无法定位到一个位置,两个通过 equals 方法相等的key,我们认为是同一个key,但是由于hashCode 没有定位到同一个位置,会导致插入重复元素,重写 equasl 就没有什么意思了。 就会出现如图的问题: ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190526230158.png) 如果重写了hashcode方法,确保两个对象在定位的时候,都能够定位到相同的位置,那么就可以遍历这条单向链表,使用equals方法判断两个对象是否相同,如果相同,那么就不插入了(HashMap的实现仍然插入,但是覆盖掉旧的value)。如果不相同,就插入到链表的头节点处。 ## 4、重写 equals 方法有什么官方规范 1. 自反性:x.equals(x) = true; 2. 对称性:如果有x.equals(y) = true,那么一定有y.equals(x) = true; 3. 传递性:对任意的x,y,z。如果有x.equals(y) = y.equals(z) = true,那么一定有x.equals(z)= true; 4. 一致性:无论多少次调用,x.equals(y)总会返回相同的结果。 5. 非空性(暂定):所有的对象都必须!=null; 步骤: 1. 使用==操作符检查“实参是否为指向对象的一个引用”,如果是则返回true; 2. 使用instanceof操作符检查“实参是否为正确的类型”,如果不是,则返回false; 3. 将传递进来的参装换为正确的要比对的类型; 4. 对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域是否匹配。如果所有测试都成功,则返回true,否则返回false。(**参考 String,是比对没个 char 的值是否相等的**) 5. 方法完成之后,确定 equals 方法的对称性,传递性,一致性。