溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中的“==”、“compareTo()”和“equals()”的區(qū)別

發(fā)布時間:2020-06-17 14:30:54 來源:網(wǎng)絡(luò) 閱讀:499 作者:nineteens 欄目:編程語言

  在比較兩個對象或者數(shù)據(jù)大小的時候,經(jīng)常會用到==、compareTo()和equals(),尤其是在接入了Comparable接口后重寫compareTo方法等場景,所以我們來理一下這三個的區(qū)別。

  1.等號"==":

  等號是最簡單也最容易理解的,如果等號的兩邊是基本數(shù)據(jù)類型,比如int,double,那么等號就用來單純的比較他們的數(shù)值大小

  如果等號兩邊放的是兩個對象,那么就會比較他們在內(nèi)存當(dāng)中的地址。

  例如:

  String a="abc";

  String b="abc";

  System.out.println(a==b);

  答案是:true

  因為相同的字符串內(nèi)容,在地址上是一樣。在Java中,String是有一個String pool的,里面存放了可以共享的字符串對象,在聲明一個String對象后,會首先去找是否存在相同的String內(nèi)容,如果有的話是不會創(chuàng)建新的對象的。在這里b實際上是引用了a的對象的值,他自己并沒有創(chuàng)建對象,所以這里的答案是true。

  但是如果我們接著

  String c=new String(“abc”);

  再

  System.out.println(a==c);

  那答案就是false,因為這二者的地址并不是一致的。

  2.compareTo()

  在Java里觀察compareTo()的源碼

  public int compareTo(String anotherString) {

  int len1 = value.length;

  int len2 = anotherString.value.length;

  int lim = Math.min(len1, len2);

  char v1[] = value;

  char v2[] = anotherString.value;

  int k = 0;

  while (k < lim) {

  char c1 = v1[k];

  char c2 = v2[k];

  if (c1 != c2) {

  return c1 - c2;

  }

  k++;

  }

  return len1 - len2;

  }

  可以觀察出,這里實際上是獲取的字符串(也可以是其他對象)的長度,然后作減法,這里的減法就是ASCII碼的減法,所以compareTo()會返回數(shù)字,如果兩個字符串內(nèi)容相同,會返回0,字符串a(chǎn)大于字符串b,會返回相差的ASCII碼的正數(shù),字符串a(chǎn)小于字符串b,會返回相差的ASCII碼的負(fù)數(shù)。

  所以 System.out.println(a.compareTo(b))的答案是:0

  3.equals()

  依舊是來觀察Java中equals()的源碼

  public boolean equals(Object anObject) {

  if (this == anObject) {

  return true;

  }無錫知名的婦科醫(yī)院 http://www.wxbhnkyy39.com/

  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;

  }

  可以觀察出,equals是先用等號(==)直接來比較兩個對象在內(nèi)存當(dāng)中的地址,如果相等會直接返回true,如果這兩個對象的地址不一樣,就會考慮這兩個對象是不是String類型的,如果是String類型的,那先比較兩個字符串長度是否一樣,如果長度不一致,那100%不相等,直接返回false。長度一致則逐個比較

  4.compareTo()和equals的區(qū)別

  compareTo()會返回二者的差值,即返回的是一個數(shù)字;而equals就簡單一些,只返回true或者false。

  最后,compareTo()和equals()都可以判斷其他基本數(shù)據(jù)類型,比如說Integer,Java的源碼中對這兩者方法都做了一些重載,可以根據(jù)參數(shù)的類型去自動匹配相應(yīng)的方法,他們的原理也非常簡單,只是一些簡單的減法或者(?:)這類判斷。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI