equals与==的区别

来源:互联网 发布:淘宝蒙娜丽莎十字绣 编辑:程序博客网 时间:2024/05/16 06:51
  1. String类为例子说明eqauls==的区别:

Java的虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。

当使用 String a = "abc"这样的语句进行定义一个引用的时候,首先会在字符串缓冲池中查找是否已经相同的对象,如果存在,那么就直接将这个对象的引用返回给a,如果不存在,则需要新建一个值为"abc"的对象,再将新的引用返回a。

String a = new String("abc");这样的语句明确告诉JVM想要产生一个新的String对象,并且值为"abc",于是就在堆内存中的某一个小角落开辟了一个新的String对象

`==`在比较引用的情况下,会去比较两个引用的内存地址是否相等。    String str1 = "abc";    String str2 = "abc";        System.out.println(str1 == str2);    System.out.println(str1.equals(str2));        String str2 = new String("abc");    System.out.println(str1 == str2);    System.out.println(str1.equals(str2));        以上代码将会输出    true    true    false    true    **第一个true:**因为在str2赋值之前,str1的赋值操作就已经在内存中创建了一个值为"abc"的对象了,然后str2将会与str1指向相同的地址。    **第二个true:**因为`String`已经重写了`equals`方法:为了方便大家阅读我贴出来,并且在注释用进行分析:    ```    public boolean equals(Object anObject) {    //如果比较的对象与自身内存地址相等的话    //就说明他两指向的是同一个对象    //所以此时equals的返回值跟==的结果是一样的。    if (this == anObject) {        return true;    }    //当比较的对象与自身的内存地址不相等,并且    //比较的对象是String类型的时候    //将会执行这个分支    if (anObject instanceof String) {        String anotherString = (String)anObject;        int n = value.length;        if (n == anotherString.value.length) {            char v1[] = value;            char v2[] = anotherString.value;            int i = 0;            //在这里循环遍历两个String中的char            while (n-- != 0) {                //只要有一个不相等,那么就会返回false                if (v1[i] != v2[i])                    return false;                i++;            }            return true;        }    }    return false;}    ```    进行以上分析之后,就不难理解第一段代码中的实例程序输出了。