(详解)Javaequals方法与==的区别和联系

    xiaoxiao2021-03-25  86

    首先, 我们必须知道equals方法是Object类中的方法, 若自己定义的类若没有重写equals方法, 就直接继承Object类的equals()方法. 这里, 我们想了解一下Object类的equals()方法:         1. 指示其他某个对象是否与此对象“相等”;         2. 默认情况下比较的是对象的引用是否相同;         3. 由于比较对象的引用没有意义,一般建议重写该方法(重写后比较的是对象中的属性值)。 ==号和equals方法的联系和区别     ==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值(引用);     equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,     如果没有重写Object类中的equals方法, equals方法和==号比较引用数据类型无区别, 重写后的equals方法比较的是对象中的属性. 废话不多说了, 上代码! 1. 比较基本数据类型的值时, 只能用==: package org.lxy.javase_2; /** * @author menglanyingfei * @date 2017-3-9 */ public class ComparisonOfBasicDataTypes { /** * @param args */ public static void main(String[] args) { int a = 10; int b = 10; System.out.println(a == b); // true } } 2. 判断定义为Student类型的s1和s2是否相等, 分为重写equals方法和没重写equals方法:

    如果没有重写Object类中的equals方法, equals方法和==号比较引用数据类型无区别, 看Object类中equals方法的JDK源码(其实底层就是==实现的)!

    提供两个学生JavaBean类, 一个没重写equals方法, 一个重写equals方法:

    Student1类:

    package org.lxy.javase_2; /** * @author menglanyingfei * @date 2017-3-9 */ public class Student1 { private String name; private int age; public Student1() {} public Student1(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } }Student2类: package org.lxy.javase_2; /** * @author menglanyingfei * @date 2017-3-9 */ public class Student2 { private String name; private int age; public Student2() {} public Student2(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } /** * 重写equals()方法 */ public boolean equals(Object object) { if(object instanceof Student2) { Student2 s = (Student2) object; return this.getName() == s.getName() && this.getAge() == s.getAge(); } return false; } } 比较程序:

    package org.lxy.javase_2; /** * @author menglanyingfei * @date 2017-3-9 */ public class ComparisonOfReferenceDataTypes { /** * @param args */ public static void main(String[] args) { Student1 s1 = new Student1("Java", 19); Student1 s2 = new Student1("Java", 19); System.out.println("未重写equals方法前:"); System.out.println(s1 == s2); // false System.out.println(s1.equals(s2)); // false Student2 s3 = new Student2("Java", 19); Student2 s4 = new Student2("Java", 19); System.out.println("重写equals方法后:"); System.out.println(s3 == s4); // false System.out.println(s3.equals(s4)); // true } }

    3. 判断定义为String类型的s1和s2是否相等:   

    首先, String类中自己已经重写了equals方法, 看下面的JDK源码:

    通过JDK提供的API,查看String类的说明, 我们可以知道:

          1. 字符串字面值”abc”也可以看成是一个字符串对象;       2. 字符串是常量,一旦被赋值,就不能被改变。 此处比较特别, String类虽然是引用数据类型,     但new的对象, 是在堆中开辟空间, 而字符串常量值则存储在内存中的常量池.             package org.lxy.javase_2; /** * @author menglanyingfei * @date 2017-3-9 */ public class ComparisonOfString { /** * @param args */ public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); // true System.out.println(str1.equals(str2)); // true } }        本文地址: http://blog.csdn.net/menglanyingfei/article/details/60966018 本文源自: http://blog.csdn.net/menglanyingfei 希望大家能多多评论和指点我的文章, 以相互交流和学习, 也欢迎大家到我的博客里看看对您有帮助的文章,  也欢迎转载,但希望在明确位置注明超链接的出处! 谢谢!
    转载请注明原文地址: https://ju.6miu.com/read-15334.html

    最新回复(0)