• Java对象相等判断


    你是谁啊?你是不是我??(⊙_⊙)?

    我们知道比较对象相等可以使用equal方法(来至Object对象的方法)

    但是你打开Object的equal方法你会发现:

    public boolean equals(Object obj) {
            return (this == obj);
    }
    

    现在我们有一个Student类

    public class Student  {
    	private String name ;
    	private int age;
    	public Student(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    }
    

    如果我们使用默认的equals方法判断stu1和stu2两个对象,得到的结果是false。因为默认的equals方法是判断两个对象的内存地址,在没有重写equals方法时调用的就是对象的==,即内存地址。

    public class Hello {
    	public static void main(String[] args) {
    		Student stu1 = new Student("小明",18);
    		Student stu2 = new Student("小明",18);
    		
    		System.out.println(stu1.equals(stu2));//false
    		System.out.println(stu1==stu2);//false
    	}
    }
    

    我怎么让你知道我就是你?

    如果要让equals比较的不是内存地址而是两个对象的内容就要对equals方法进行重写(这里使用Eclipse自动的生成方法)

    public class Student  {
    	private String name ;
    	private int age;
    	public Student(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
    	
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + age;
    		result = prime * result + ((name == null) ? 0 : name.hashCode());
    		return result;
    	}
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Student other = (Student) obj;
    		if (age != other.age)
    			return false;
    		if (name == null) {
    			if (other.name != null)
    				return false;
    		} else if (!name.equals(other.name))
    			return false;
    		return true;
    	}
    		
    }
    
    

    这里重写了equals方法和hashCode方法,为啥子还要重写equals方法,这个...这个o_o ...后面再说。
    我们看到重写的equals方法比较了两个对象的属性是否相等,属性都相等就认为是同一个对象了。让我们再次测试刚才的相等判断。

    public class Hello {
    	public static void main(String[] args) {
    		Student stu1 = new Student("小明",18);
    		Student stu2 = new Student("小明",18);
    		
    		System.out.println(stu1.equals(stu2));//ture
    		System.out.println(stu1==stu2);//false
    		System.out.println(stu1.hashCode());
    		System.out.println(stu2.hashCode());
    	}
    }
    

    结果:

    true
    false
    758222
    758222
    

    可以看到两个对象进行equals判断结果已经为true了。同时两个对象也拥有相同的hashCode值,但是为啥要重写hashCode方法,这个hashCode值有啥用呢?

    Object中的equals方法解释

    其他解释参考:
    浅谈Object的hashCode方法的作用
    为什么HashCode对于对象如此的重要

    总结 :

    == 基本类型来说是值比较,引用类型来说是比较的是引用;

    equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

    --------------- 我每一次回头,都感觉自己不够努力,所以我不再回头。 ---------------
  • 相关阅读:
    使用spring AOP获得session的思路
    Oracle相关操作示例(导出导入dmp需要采用)
    sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    Java之旅hibernate(8)——基本关系映射
    进一步优化SPA的首屏打开速度(模块化与懒载入) by 嗡
    Codeforces461A Appleman and Toastman 贪心
    程序猿,一个吃青春饭的行业
    The 14th UESTC Programming Contest Final B
    我开发的“小灵”,自觉得比微软“小冰”好多了
    windows下安装配置apacheserver
  • 原文地址:https://www.cnblogs.com/zjw-blog/p/11886204.html
Copyright © 2020-2023  润新知