java基礎之談談==和equals

判斷對象是否相等是咱們在項目中常常用到的,也是入門java必學的知識。今天就來談談==和equals的做用和區別。
1.==如何判斷相等
先看一下一段代碼:java

int i1 = 1;
        int i2 = 1;
        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(i1==i2);
        System.out.println(s1==s2);,

運行結果是true false,爲何一個是相等,而第二個是不等的。
1)對於基礎類型(char、byte、short、int、long、float、double、boolean )==的做用就是判斷值是否相等好比1.1==1.1是true,1=2是false。
2)對於對象來講,==的做用是判斷對象的引用(對象的內存地址)是否一致。若是想判斷對象的值是否一致,就須要用到equals。
2.equals的做用
先看一段代碼:this

String s1 = new String("abc");
    String s2 = new String("abc");
    System.out.println(s1.equals(s2));
    System.out.println(s1==s2);

運行結果:true false,那麼爲何equals和==的結果是不同的?
equals是java.lang.Object中的方法,全部對象都是繼承Objetct的,也就是全部對象都擁有equals方法。源碼以下:code

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

原始的實現很簡單就是用了==,可是咱們能夠重寫equals方法,達到咱們想要的判斷值的標準。String.class就是重寫了equals方法,因此出現了==和equals結果不一致的狀況。
String.class重寫equals的代碼:對象

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        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;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

經過判斷每個字符是否一致來判斷2個String對象是否一致。固然重寫equals是有必定的標準的,如:傳遞性,對稱性等等,具體能夠看源碼要求再也不一一展開。
3.總結:
1).==用於基礎數據類型時是判斷值是否一致
用於對象時是判斷對象的引用(所在的內存地址)是否一致
2)equals不可用於基礎數據類型
默認也是使用==進行判斷,可是可經過重寫方法來定義本身的判斷標準(重寫equals方法時也須要重寫hashcode方法)繼承

相關文章
相關標籤/搜索