== 和 equals 的区别

来源:互联网 发布:淘宝店主照片认证 编辑:程序博客网 时间:2024/06/07 09:28
  • 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
  • ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  • equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
  • ==比较的是2个对象的地址,而equals比较的是2个对象的内容,显然,当equals为true时,==不一定为true。

java代码:

People类(用于演示)

package demo8;/** *  * @ClassName: People * @Description:演示 * @author cheng * @date 2017-8-11 下午04:32:16 */public class People {    private String name;    private int age;    public People() {        super();    }    /**     * 重写     */    @Override    public boolean equals(Object obj) {        if (obj instanceof People) {            People p = (People) obj;            //若两者的类型相同,重新定义内容相同的规则            if (this.getName().equals(p.getName())                    && this.getAge() == p.getAge()) {                return true;            }            return false;        }        return false;    }    public People(String name, int age) {        super();        this.age = age;        this.name = name;    }    @Override    public String toString() {        return "People[name=" + name + ",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;    }}

测试

package demo8;/** *  * @ClassName: AddressTest * @Description: 测试 * @author cheng * @date 2017-8-14 下午03:29:09 */public class AddressTest {    public static void main(String[] args) {        People p1 = new People("张三", 100);        People p2 = new People("李四", 200);        People p3 = p2;        People p4 = new People("张三", 100);        System.out.println(p2 == p3);//依据下图可知,指向的对象地址一致,true        System.out.println(p2.equals(p3));//依据下图可知,指向的对象内容一致,true        System.out.println(p1 == p4);//依据下图可知,指向的对象地址不一致,false        System.out.println(p1.equals(p4));//依据下图可知,指向的对象内容一致,true    }}

图示:

这里写图片描述

关于String类型的比较

测试

package demo8;/** *  * @ClassName: AddressTest * @Description: 测试 * @author cheng * @date 2017-8-14 下午03:29:09 */public class AddressTest {    public static void main(String[] args) {        String str1 = "str1";//查看字符串池,发现没有此字符串,创建一个新对象        String str2 = "str2";//查看字符串池,发现没有此字符串,创建一个新对象        String str3 = str2;//直接复制引用,两个引用指向同一个对象        String str4 = "str1";//查看字符串池,发现有此字符串,直接指向此对象        String str5 = new String("str1");//直接创建一新个对象        String str6 = new String("str1");//直接创一个新对象        System.out.println(str1 == str4);//依据下图可知,指向的对象地址一致,true        System.out.println(str1.equals(str4));//依据下图可知,指向的内容一致,true        System.out.println(str2 == str3);//依据下图可知,指向的对象地址一致,true        System.out.println(str2.equals(str3));//依据下图可知,指向的内容一致,true        System.out.println(str1 == str5);//依据下图可知,指向的对象地址不一致,false        System.out.println(str1.equals(str5));//依据下图可知,指向的内容一致,true        System.out.println(str5 == str6);//依据下图可知,指向的对象地址不一致,false        System.out.println(str5.equals(str6));//依据下图可知,指向的内容一致,true    }}

图示:

这里写图片描述

注意:

1.String中已经复写了equals(),源代码如下:

public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String anotherString = (String)anObject;        int n = count;        if (n == anotherString.count) {        char v1[] = value;        char v2[] = anotherString.value;        int i = offset;        int j = anotherString.offset;        while (n-- != 0) {            if (v1[i++] != v2[j++])            return false;        }        return true;        }    }    return false;}

2.String类两种创建方式的不同

第一种方式:
先去字符串池查找是否有相同的字符串,
若有相同的字符串,直接指向该字符串,不创建新的对象;
若没有相同的字符串,创建一个新的字符串对象,并放到字符串池中

String str1 = "str1";String str2 = "str1";String str3 = "str2";

创建如下图:
这里写图片描述

第二种方式:
只要看到new关键字,直接创建一个新的对象.并且不会把创建的字符串放到字符窗池中!!!

String str1 = new String("str1");String str2 = new String("str1");String str3 = new String("str2");

创建如下图:
这里写图片描述

特别注意:

String str1 = new String("str1");//创建一个新的对象String str2 = "str1";//字符串池中没有此字符串,创建一个新的对象System.out.println(str1 == str2);//两者指向的对象地址不一致,false