== 和equals ,重写equals和hashCode

97 阅读2分钟
  1. 对于基本类型,==比较的是值;
  2. 对于引用类型,==比较的是地址;
  3. equals不能用于基本类型的比较; (说不能吧,其实equals是stirng类型的一个方法,基本数据类型根本没有equals)

int a = 1; int b = 1; Objects.equals(a,b) //true 底层 public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }

  1. 如果没有重写equals,equals就相当于==;
  2. 如果重写了equals方法,equals比较的是对象的内容;

例子

未重写例子

public class User { private String name; private String email; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } public static void main(String[] args) { User user1 =new User(); User user2 =new User(); user1.setName("joe"); user2.setName("joe"); user1.setEmail("j@11.com"); user2.setEmail("j@11.com"); System.out.println(user1.equals(user2)); //false }

重写后的,这里新加了一个int 类型的id 进行比较。

import java.util.Objects; /** * @author 枝上生风 * @version 1.0 * @date 2024/1/9 下午 2:14 */ public class User { private int id; private String name; private String email; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public boolean equals(Object obj) { //1.先比较地址是否相等 这样开销最小 if (this == obj) return true; //2.如果比较的对象会null 则直接返回false if (obj == null) return false; //3.检测比较的对象与当前对象是否属于同一个类 不属于则返回false if (this.getClass() != obj.getClass()) return false; //4.转化为特定类型 User user = (User) obj; //5.最终进行字段的比较 return user.id == id && Objects.equals(user.name, name)&& Objects.equals(user.email,email); } } public static void main(String[] args) { User user1 =new User(); User user2 =new User(); user1.setName("joe"); user2.setName("joe"); user1.setEmail("j@11.com"); user2.setEmail("j@11.com"); System.out.println(user1.equals(user2)); //true }

重写equals时,

重写hashCode()

一般情况下重写equals时都重写hashCode

重写:

@Override public int hashCode() { return Objects.hash(id,name,email); }

2.1重写hashcode原因

个人总结的第一个,hashSet时可以去重,不然不能去重。

  1. hashCode()方法用于散列数据的快速存储,HashSet/HashMap/Hashtable类存储数据时都是根据存储对象的hashcode值来进行分类存储的,一般先根据hashcode值在集合中进行分类,在根据equals()方法判断对象是否相同。
  2. HashMap对象是根据其Key的hashCode来获取对应的Value。
  3. 生成一个好的hashCode值能提高HashSet查找的性能,差的hashCode值不但不能提高性能,甚至可能造成错误。比如hashCode方法中返回常量,会让,HashSet的查找效率退化为List集合的查找效率;hashCode方法中返回随机数,会让查找结果变的不可预测。
  4. 好的hashCode生成方式是让对象中的关键属性与质数相乘,并将积相加获取。