Java中 == 和 equals 的区别

== 是运算符,用于比较两个数据是否相等,但它比较的是数据的内存地址是否一样(是否指向的是同一个对象)。

equals()是Object类(Java中类层次结构的根类)提供的一种方法,它也用于两个对象是否相等,在Object类中它重用了‘ ==’,即也是比较两个对象的内存地址是否相同,但是在String类中重写了equals方法,使得在String类中只是比较对象的值是否相等,即两个字符串的字符和顺序是否相同,如果是则返回Ture,否则返回False。

            如:String s1 = "hello";

                   String s2 = "hello";

                   String s3 = new String(s1);

                   System.out.println(s1 ==s2);//结果为true

                   System.out.println(s1 ==s3);//结果为false

                   System.out.println(s1.equals(s3));//结果为ture

                   System.out.println(s2.equals(s3));//结果为true

 这是因为在JVM中内存管理分为三个部分:

    栈内存:用来存放变量的,由系统管理,声明的变量会存在这里

    堆内存: 由程序申请使用和管理,例如创建的对象就存放在这里

    常量池:存放基本类型的值和字符串值,不能出现重复的值

      当变量s1引用字符串“hello”时,JVM会先在常量池里看是否有"hello"字符串,如果有,就直接引用这个对象,如果没有,则先把"hello"存入常量池,然后再引用。当变量s2也引用字符串"hello"时,由于常量池中已经存在这个字符串值,所以直接引用这个对象。所以 s1==s2为true

    当使用 new string(s1)时,JVM会先管理变量s1所引用的对象,即常量池中的字符串"hello",再用String类构造器创建一个String对象,这个String对象存放在堆内存中。所以“hello”和 new String(s1)是两个对象,变量s3指向的是堆内存中的对象,而变量s1和s2指向的是常量池中的对象,所以 s1、s2、s3变量的值都为“hello”,但是 s1 ==s3 为false,而用s1.equals(s3)为true.

      所以写程序时,我们可以根据需求重写equals方法,来达到不同的目的。

                   

猜你喜欢

转载自136416513.iteye.com/blog/2342729