Java中的==和equals的区别详解

1.基础知识

(1)String x = "hello";

(2)String x = new String ("hello");

第1种方式的工作机制是,首先看内存中有没有存放值为"hello"的地址,如果有则将x指向这块内存地址;如果没有则在内存中重新开辟一块地址存放值"hello",并将x指向这块内存地址。

String x = "hello";
String y = "hello";

所以上面的x,y都指向同一块内存地址。

第2种方式的工作机制是,不管内存中有没有存放值为"hello"的地址,都会重新开辟一块地址来存放值"hello"。

String x = new String("hello");
String y = new String("hello");

所以上面的x,y分别指向不同的地址。

2.==的详解

==对于基本类型和引用类型的作用效果是不一样的:

  • 基本类型(byte,char,boolean,short,int,float,long,double)比较的是是否相等。
  • 引用类型比较的是引用是否相同。
String x = "hello";
String y = "hello";
String z = new String("hello");
        
System.out.println(x==y);    //结果是:true
System.out.println(y==z);    //结果是:false

3.equals的详解

equals是基类object中定义的方法,jdk中源代码如下:

所以equals的本质就是==,即判断两个引用是否相同。

public class Person
{
    private String name;
    
    public Person(String name)
    {
        this.name=name;
    }
    
    public static void main(String[] args)
    {
        Person x=new Person("小明");
        Person y=new Person("小明");
        
        System.out.print(x.equals(y));    //结果:false
    }
}

上面的代码很容易理解,虽然x,y对象的name值都是"小明",但是它们本来就是两个不同的对象,所以equals的值为false。

注意:!!!

String类中,equals被重写了,功能变成了比较是否相同,源代码如下:

String x = "hello";
String y = "hello";
String z = new String("hello");
String m = new String("hello");
        
System.out.println(x==y);        //结果是:true
System.out.println(y==z);        //结果是:false
System.out.println(y.equals(z));//结果是:true
System.out.println(z.equals(m));//结果是:true

4.总结

==是比较引用是否相同。

equals本质就是==,但对于某些类(String)来说比较的是

猜你喜欢

转载自www.cnblogs.com/yahuian/p/10751506.html