【java】equals和==区别

1.==介绍

==:它是一个运算符,如果操作两边都是对象,比较的是它们在内存中的存放地址,如果两个指向同一个对象,则为true,否则为false,如果两边是基本数据类型,则比较的是值。

2.equals介绍

equals:它比较的是两个对象的内容,如果不重载equals方法,自动调用Object的equals方法,则和“==”一样,在JDK中像String、Integer默认重载了equals方法,则比较的是对象的内容;如果是一个自己创建的类,要比较两个对象的内容,则需要在类中重载equals方法;

equals的特性:

1)自反性:当一个对象型变量obj是个非空对象引用时,obj.equals(obj)的结果是真;

2)对称性:对两个对象型变量obj1,obj2,如果obj1.equals(obj2)的结果为真,同时obj2.equals(obj1)的结果也毕竟为真;

3)传递性:对三个对象变量obj1,obj2,obj3,如果obj1.equals(obj2)为真,obj2.quals(obj3)的结果也为真,那么obj1.equals(obj3)的结果必定为真;

4)一致性:对象型变量在发生变化的前提下,多次调用obj1.equals(obj2)的结果都是一样的;

5)对于任何非空的对象型变量obj,obj.equals(null)的结果应该是false.

根据例子看:

public class Test {
    public static void main(String[] args) {
        String str1="abc"; //abc在常量池中
        String str2="abc";
        int a=1;
        int b=1;
        String str3=new String("abc"); //在堆栈中重新开辟一个abc空间
        String str4=new String("abc");
        System.out.println(a==b);
        System.out.println(str1==str2);
        System.out.println(str1.equals(str2));
        System.out.println(str3==str4);
        System.out.println(str3.equals(str4));
        System.out.println(str1==str3);
        System.out.println(str1.equals(str3));
    }
}

结果:

这里涉及到了String中常量池中的问题,可以通过String中的intern方法;

public class Test {
    public static void main(String[] args) {
        String str1="abc"; //abc在常量池中
        String str2="abc";
        int a=1;
        int b=1;
        String str3=new String("abc"); //在堆栈中重新开辟一个abc空间
        String str4=new String("abc");
        System.out.println(a==b);  //true
        System.out.println(str1==str2);  //true
        System.out.println(str1.equals(str2));  //true
        System.out.println(str3==str4);  //false
        System.out.println(str3.equals(str4));  //true
        System.out.println(str1==str3);  //false
        System.out.println(str1.equals(str3));//true
        System.out.println(str3.intern()==str4.intern());  //true
        System.out.println(str1.intern()==str3.intern());  //true
    }
}

具体地在String中介绍。

class Human{
    int age;
    String sex;
    String name;
    public Human(int age,String sex,String name){
        this.age=age;
        this.sex=sex;
        this.name=name;
    }
}
public class Student {
    public static void main(String[] args) {
        Human h1=new Human(20,"男","张三");
        Human h2=new Human(20,"男","张三");
        System.out.println(h1.equals(h2));
    }
}

结果为:

这是因为没有在Human类中重载equals方法,要比较的类中的所有属性,只有所有属性都一样了,两个对象才能相等;

class Human{
    int age;
    String sex;
    String name;
    public Human(int age,String sex,String name){
        this.age=age;
        this.sex=sex;
        this.name=name;
    }
    @Override
    public boolean equals(Object obj) {
        if(age==((Human)obj).age&&sex.equals(((Human)obj).sex)&&name.equals(((Human)obj).name)){
            return true;
        }
        return false;
    }
}
public class Student {
    public static void main(String[] args) {
        Human h1=new Human(20,"男","张三");
        Human h2=new Human(20,"男","张三");
        System.out.println(h1.equals(h2));
    }
}

3.两个的作用

1)==的作用

基本类型:比较的就是值否相等;

引用类型:默认情况下,比较的是地址值是否相等

2)equals的作用

引用类型:默认情况下,比较的是地址值,重写该方法后,比较的是对象的成员变量值是否相等。

4.问题

String str=new String ("abc");创建了几个对象?

首先要看常量池中是否有“abc"这个字符串,如果有(String str="abc",出现时则有)则创建一个,如果没有,则创建两个(个在常量池中,一个在堆中)。

发布了62 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43669007/article/details/101720784