干正斯

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一.关系操作符“==”到底比较的是什么?

下面这个句话是摘自《Java编程思想》一书中的原话:

  “关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。

==比较的是值,无论是基本类型还是引用类型,比较的都是值

通过代码结合

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int n=3;
        int m=3;
        
        System.out.println(n==m);
        
        String str=new String("hello");
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        System.out.println(str1==str2);
        
        str1 = str;
        str2 = str;
        System.out.println(str1==str2);
    }

}

输出结果是:true false true

因为当==比较的两个对象是基本类型时,直接比较两个对象的值

而当==比较的是两个引用对象时,比较的是两个引用对象指向堆中真正的对象的地址

str1和str2是两个引用对象,他们保存的是真正对象的地址,每当new出一个对象时,地址是不一样的,所以str1不等于str2

str1=str,str2=str:是相当于把str所引用的对象的地址赋给了他们,所以此时比较值时是一样的

二:分析equals的源码

equals是根类Obeject中的方法。源代码如下:

public boolean equals(Object obj) {
    return (this == obj);
}

由此可以看出object的equals比较其实就是在内部调用了==进行比较,也是比较值,即比较真正对象的地址;

不同的子类,可以重写此方法,进行两个对象的equals的判断。

  String类源码中重写的equals方法如下,

1     public boolean equals(Object anObject) {
 2         if (this == anObject) {
 3             return true;
 4         }
 5         if (anObject instanceof String) {
 6             String anotherString = (String) anObject;
 7             int n = value.length;
 8             if (n == anotherString.value.length) {
 9                 char v1[] = value;
10                 char v2[] = anotherString.value;
11                 int i = 0;
12                 while (n-- != 0) {
13                     if (v1[i] != v2[i])
14                             return false;
15                     i++;
16                 }
17                 return true;
18             }
19         }
20         return false;
21     }

从上面的代码中可以看到,

  (1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。

  (2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false。

 

 

参考:https://www.cnblogs.com/xudong-bupt/p/3960177.html

 

posted on 2018-08-28 17:00  干正斯  阅读(139)  评论(0)    收藏  举报