网站服务器建设方法,做网站备案须知,做网站比较好,有免费网站推荐吗文章目录hashCode 和 equals 的处理1. 阿里巴巴编程规范要求2. equals和hashcode的分析2.1 Object方法2.2 只覆写#xff08;Override#xff09;equals带来的问题问题演示问题分析问题处理hashCode 和 equals 的处理
1. 阿里巴巴编程规范要求 2. equals和hashcode的分析
2…
文章目录hashCode 和 equals 的处理1. 阿里巴巴编程规范要求2. equals和hashcode的分析2.1 Object方法2.2 只覆写Overrideequals带来的问题问题演示问题分析问题处理hashCode 和 equals 的处理
1. 阿里巴巴编程规范要求 2. equals和hashcode的分析
2.1 Object方法 java中所有类都直接或间接继承自java.lang.Object类也就是Object是java中所有类的祖先即根类 equals和hashcode是Object类提供的方法
hashcode方法返回的是一个对象的hash码是由Object类本地方法生成的equals方法比较的对象的引用地址 在Java的一些集合类中一般会重写这两个方法。 在比较两个对象是否相等时候会根据以下规则会先调用对象的hashCode方法得到hashCode进行比较如果hashCode不相同就可以直接认为这两个对象不相同如果hashCode相同那么就会进一步调用equals方法进行比较而equals方法就是用来最终确认两个对象是否相等的。 通常equals方法比较重逻辑比较多而hashCode方法主要就是得到一个哈希值实际上是一个数字相对而言比较轻所以比较两个对象时通常会先根据hashCode比较一下
2.2 只覆写Overrideequals带来的问题 如果只覆写equals而不复写hashcode可能导致导致equals相等而hashcode不相等在使用HashMap进行存储时候会出现问题 问题演示
public class Person {private String name;public Person(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;Person person (Person) o;return Objects.equals(name, person.name);}Overridepublic String toString() {return Person{ name name \ };}
}public class TestHashMap {public static void main(String[] args) {MapPerson, String map new HashMap();map.put(new Person(Kevin),Hi);System.out.println(map.get(new Person(Kevin)));}
}执行结果
null问题分析 因为散列结合是使用 hashCode 来计算 key 的存储位置如果存储两个完全相同的对象但是有不同的 hashcode 就会导致这两个对象存储在 hash 表的不同位置当我们想根据这个对象去获取数据的时候就会出现一个完全相同的对象会在存储在 hash 表的两个位置。 问题处理 重写hashCode方法 重新equals方法一定要重写hashCode方法 public class Person {private String name;public Person(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;Person person (Person) o;return Objects.equals(name, person.name);}Overridepublic int hashCode() {return Objects.hash(name);}Overridepublic String toString() {return Person{ name name \ };}
}再次执行结果
Hi