【Java_2 == 和equals 详解】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

【Java_2 equals 详解】

  • 1. == 和equals的区别


1. == 和equals的区别

1. 对象 和类型不同:

  1. equals():是超类Object中的方法。
  2. ==:是操作符。

2.比较的对象不同:

  1. equals用来检测对象的内容是否相等
  2. ==
    • 基础数据类型:比较他们的值是否相等
    • 引用数据类型: 引用的值是否相等
	//Object中 equals的源码
    public boolean equals(Object obj) {
        return (this == obj);
    }
public class Employee {
    private String name;
    private double salary;
    private int year;
    private int month;
    private int day;
    private LocalDate hireDay;
    public Employee(){

    }
    public Employee(String name, double salary, int year, int month, int day) {
        this.name = name;
        this.salary = salary;
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public double getSalary(){
        return this.salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }


    //euqals方法用于检测一个对象是否等于另一个对象
    //Object 类中的equals方法确定两个对象引用是否相等
    //重写Object中的equals方法,接收的参数要是 Object
    public boolean equals(Object otherObject){

        if (this == otherObject) return true;
        if (otherObject == null) return false;

        //getClass() 返回一个对象所属的类
        //子类有自己相等性的概念,对称性要求将强制使用getClass检测
        //如果由超类决定相等性概念,可以用instanceof 检测
        // if( !(otherObject instanceof Employee) ) return false;
        if (getClass() != otherObject.getClass()) return false;

        Employee other = (Employee) otherObject;
        return name.equals(other.name)
                && salary == other.salary
                && Objects.equals(hireDay,other.hireDay) ;
    }
}

对equals重新需要注意五点:

1、自反性:对任意引用值X,x.equals(x)的返回值一定为true;

2、对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;

3、传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;

4、 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;

5、非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。

==:
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作

1、比较的是操作符两端的操作数是否是同一个对象。

2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。

3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:

int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

equals:
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断

String s="abce"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。

String s="abce";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象

如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象如果没有,则在常量池中新创建一个“abcd"”,下一次如果有Strings1=“abcd”;又会将s1指向“abcd”这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象。

而String s=new String("abcd”);和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。

也可以这么理解:String str="hello”;先在内存中找是不是有“hello”这个对象,如果有,就让str指向那个“hello”。

如果内存里没有"hello",就创建一个新的对象保存"hello”.String str=new String(“hello")就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。

转自:
https://zhuanlan.zhihu.com/p/338350987?utm_id=0

你可能感兴趣的:(java,开发语言)