Java中equals()和==號的區別

  今天使用==和equals在比較字符串的時候遇到了問題,所以總結了一下比較時使用==和equals的區別,如下:

  • 對於基本數據類型:
    ①==的使用:只是比較基本數據類型的值,如下:
int num1 = 12;
int num2 = 13;
System.out.println(num1 == num2);//false
System.out.println(num1);//12
char num3 = 'a';
char num4 = 'a';
System.out.println(num3 ==  num4);//true
System.out.println(num3);//a
  • 對於引用類型:
    ①普通對象,使用==和使用equals效果相同,都是比較對象的地址值是否相同;
    因爲每個對象都默認繼承了Object類,而Object類中的equals()方法如下:
 public boolean equals(Object obj) {
        return (this == obj);
    }

例子如下:

Equals_MarkDistinction obj1 = new Equals_MarkDistinction();
Equals_MarkDistinction obj2 = new Equals_MarkDistinction();
System.out.println(obj1 == obj2);//false
System.out.println(obj1.equals(obj2));//false
        System.out.println(obj1);//com.day3.Equals_MarkDistinction@6a2ab65b
        System.out.println(obj2);//com.day3.Equals_MarkDistinction@1a2a46d1

②對於Integer、String、Date等類重寫了equals方法,所以==和equals使用不同:==比較兩個對象的地址值;equals是比較兩個對象的值是否相等;

Integer類

Integer的equals重寫了Object的equals方法,如下:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

Integer例子如下:

Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);//true
System.out.println(num1.equals(num2));//true
System.out.println(num1);//12


Integer num3 = new Integer(12);
Integer num4 = new Integer(12);
System.out.println(num3 == num4);//false
System.out.println(num3.equals(num4));//true
System.out.println(num3);//12
System.out.println(num4);//12

String類

string類重寫了Object的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;
    }

String類使用==和equals舉例如下:

    String str1 = "aa";
    String str2 = "aa";
    System.out.println(str1 == str2);//true
    System.out.println(str1);//aa
    System.out.println(str2);//aa


    String str3 = new String("aa");
    String str4 = new String("aa");
    System.out.println(str3 == str4);//false
    System.out.println(str3.equals(str4));//true
    System.out.println(str3);//aa
    System.out.println(str4);//aa

    String str5 = new String();
    str5 = "aa";
    String str6 = new String();
    str6 = "aa";
    System.out.println(str5 == str6);//true
    System.out.println(str5.equals(str6));//true
    System.out.println(str5);//aa
    System.out.println(str6);//aa

String類的三種賦值方式內存如下:

這裏寫圖片描述

主要知識點:

1.爲什麼Integer類和String類的對象打印出來是值,而一般的對象打印出來是一個物理地址,是應爲要在控制檯打印信息必須要調用toSting()方法,而Integer、String類重寫了Object的toString()方法:

①String類的toString()方法如下:

 public String toString() {
        return this;
    }

②Integer的toSting()方法如下:

   public static String toString(int i, int radix) {

        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
            radix = 10;

        /* Use the faster version */
        if (radix == 10) {
            return toString(i);
        }

        char buf[] = new char[33];
        boolean negative = (i < 0);
        int charPos = 32;

        if (!negative) {
            i = -i;
        }

        while (i <= -radix) {
            buf[charPos--] = digits[-(i % radix)];
            i = i / radix;
        }
        buf[charPos] = digits[-i];

        if (negative) {
            buf[--charPos] = '-';
        }

        return new String(buf, charPos, (33 - charPos));
    }

③Object的toString()方法如下:

  public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章