日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Java 比较(==, equals, compareTo, compare)

發(fā)布時(shí)間:2023/12/19 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 Java 比较(==, equals, compareTo, compare) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在Java中,有 ==, equals(), compareTo(), compare() 等方法可以比較兩個(gè)值或?qū)ο螅容^容易混淆。畫了個(gè)簡單的思維導(dǎo)圖總結(jié)一下

Java Compares

我經(jīng)常記不住Java中的各種比較方法,為什么設(shè)計(jì)者要弄出這么多種比較?

設(shè)計(jì)源于生活,如果我們先想一想現(xiàn)實(shí)世界中一般會(huì)如何做比較,也許會(huì)對理解Java的設(shè)計(jì)有所幫助吧。那么,在現(xiàn)實(shí)世界中,我們是怎么進(jìn)行比較的呢?

假如給定兩個(gè)物體,如果要對二者作比較的話,一般我們會(huì)先問:

有可比性嗎?

如果沒有可比性,那就無需再談。但是從廣義上講,其實(shí)任何東西都可以互相比較的,所以可比性是有個(gè)限定范圍的,即如果要兩者可比,那就得限定規(guī)則范圍,這樣也就可以理解 Java 中 compareTo 了:

**在 Java 中 compareTo() 可以比較的兩個(gè)對象的類必須都實(shí)現(xiàn) Comparable 接口。

compare() 則是 Comparator 接口定義的方法。**

如果有可比性,又會(huì)問:

為什么比?
比啥?
怎么比?

讓我們挨個(gè)來看:

為什么比?
因?yàn)橐鶕?jù)比較的結(jié)果來做決策或決定,具體就不展開了,各種應(yīng)用情況不一樣。比如:公司的績效考核評優(yōu),運(yùn)動(dòng)會(huì)比賽奪冠等等。

**在 Java 中 equals()的比較結(jié)果是 boolean 類型,如果是 true 則表示二者相同的時(shí)候do something, 否則不同的時(shí)候 do else things,

而compareTo() ,compare() 的比較結(jié)果是:0表示相同,正負(fù)數(shù)表示不同,至于是正負(fù)多少,看所不同的字符在編碼表中的差距。至于為啥要這么設(shè)計(jì),我初步的想法是,根據(jù)不同的返回值的大小,可以用于排序,但具體還沒想通(以后補(bǔ)上)

比啥?
這個(gè)要比的方面真是很多,讓我們簡單舉幾個(gè)例子:

1。小朋友開始學(xué)數(shù)學(xué)的時(shí)候,會(huì)被問到“2”和“3”哪個(gè)大啊? 這里比較的是簡單的數(shù)值,在Java中多設(shè)計(jì)為基本數(shù)據(jù)類型。

在 Java 中,用 == 來比較基本數(shù)據(jù)類型(Primitive Type),直接比較的是值(Value)是否相等。
equals() 和 compareTo() 都是方法,不適用于基本數(shù)據(jù)類型。

2。你一定聽過也許是親自體會(huì)過,“你看人家老王家的某某,這次又比你考的好。。。”,這比的啥?成績,很直觀的數(shù)據(jù)比較。類似還有,你和你弟弟一般高嗎?量下身高數(shù)據(jù)即可。

這里也是數(shù)值,和前面的例子稍不同的是,身高是老王家的某某的一個(gè)指標(biāo),在 Java 中一般把老王家的某某,定義為某個(gè)類比如Person類的一個(gè)對象,身高則是他的一個(gè)屬性。因?yàn)閷ο蟮膶傩酝ǔ1容^多,為了簡化問題,在這里讓我們做個(gè)假設(shè):兩個(gè)對象是同一個(gè)類的對象,只有一個(gè)屬性。這種情況下如何判斷這兩個(gè)對象是否相同呢?(比如是不是同一個(gè)人(Person)?)

在 Java 中,對于引用類型的對象,可以用重寫Object類的equals()方法比較兩個(gè)對象的屬性值,也是看值(Value)是否相等。compareTo()似乎也可以用,不過應(yīng)該不太常用在這種情況

3。你老板這天過來找你:小王,你比較下兩個(gè)品牌電腦上半年的銷售情況,我發(fā)了兩個(gè)電子清單給你,下班前給我個(gè)報(bào)告。“ 這會(huì)兒不太好直接進(jìn)行數(shù)據(jù)比較了,咋辦?你準(zhǔn)備寫了Java程序來干這活,不然你今晚就得加班了。

這種情況在 Java 中,這兩份文檔就得作為引用類型來比較了,equals(), compareTo(),compare() 就派上用場了。== 也可以用,但一般不直接使用,容易出問題。

怎么比
寫程序前,你先大概瀏覽了一下兩個(gè)文件,突然發(fā)現(xiàn)怎么內(nèi)容都差不多嘛,再仔細(xì)看看,分明就是同一份清單,可能老板復(fù)制了同一份。

在 Java 中,equals() 和 compareTo(), 包括compare()的實(shí)現(xiàn), 在比較兩個(gè)對象的時(shí)候,都會(huì)先做一個(gè)判斷,判斷二者是否是同一對象。這里就用到了 == ,比較的是這兩個(gè)引用存的是否是同一地址

public boolean equals (Object x){
  if(this == x) return true;
  ....
}

可能還有一種情況,你發(fā)現(xiàn),咦,怎么有一份文件是空的?這沒法比了。

在 Java 中,equals()方法 x.equals(null) 返回的是false。 而 x.compareTo(null) 返回的則是NullPointerException,這個(gè)得注意了。

不管怎樣,后來終于可以認(rèn)真比較了,你可能要比較很多方面:

各電腦品牌的銷售地域是否相同
各地域銷量是否相同
如何按價(jià)格排序
如何按銷量排序
...

那么你是要用 equals(), 還是compareTo(), 亦或是compare()?

我個(gè)人的理解:

1。如果只是需要在某個(gè)方法中簡單的比較屬性值是否相等,用equals()

在 Java 中,equals() 是 Object 類的方法,有默認(rèn)實(shí)現(xiàn)方法,返回值是boolean。(比如比較 兩個(gè)String,如果長度不等,返回false, 否則比較各個(gè)字符,如均同則返回true)。

實(shí)際應(yīng)用中,比如Date對象,Java默認(rèn)的實(shí)現(xiàn)方式是比較getTime()毫秒級的,如果你的程序需要比較年月日,這時(shí)候可重寫equals方法。

public boolean equals(Object x){
if (this == x) return true;
if (x == null) return false;
if (this.getClass() != x.getClass()) return false; // Not sure what if inheritance?
Date that = (Date) x;
if (this.day !=that.day) return false;
if(this.month!=that.month) return false;
if (this.year!=that.year) return false;
return true;
}


2。如果需要進(jìn)行排序,可結(jié)合compareTo() 和 compare() 方法。

> compareTo():  對象須實(shí)現(xiàn) Comparable 接口 (必須有可比性)

> compare() : Comparator 接口中定義的方法,具體實(shí)現(xiàn)時(shí)可調(diào)用compareTo() 方法。

二者返回值類似,0 表示相同,負(fù)數(shù)表示排在前,正數(shù)表示排在后。

都是排序,有什么特別的區(qū)別嗎?

> compareTo(): Java 稱之為Lexicographically 排序,以String對象為例,從源碼可看到,比較的是某一index上的字符的Unicode編碼值。
- 每個(gè)index上的字符都相同且字符串長度相等,返回 0
- 某個(gè)index上的字符沒有對應(yīng)的另一字符串Index,返回 字符串長度差值
- 某個(gè)index上的字符有對應(yīng)Index但是Unicode值不同,返回二者Unicode值的差值

很明顯, compareTo() 使用比較局限,適合作為low level的底層調(diào)用。

> compare() 則可更靈活,比如按照產(chǎn)品的銷售區(qū)域,價(jià)格,銷量等多種方式來排序,則可在類中重寫compare()方法,或使用匿名類實(shí)現(xiàn)該方法,便于以后的sort方法。

class XX {
public int compare(Product p1, Product p2){
return p1.price - p2.price;
}
}

// 匿名類
Collections.sort(list, new Comparator(){
@Override
public int compare(Product p1, Product p2) {
return p1.price - p2.price;
}
}


以上是我的一些粗淺的認(rèn)識,關(guān)于比較這一塊有時(shí)候的話還得再深入一下。

另外排序也是后續(xù)會(huì)重點(diǎn)學(xué)習(xí)的方面,畢竟最基本的算法就是排序算法了。

**如何理解 引用類型的 == 是指向同一個(gè)對象? **

我在簡書上寫了這篇文章,發(fā)表后,我分別分享了一份到博客上,一份到我的微信公眾號上,
也就是說,我的博客和公眾號上都各有一個(gè)link指向我的這篇簡書文章。

博客和微信的地址類似于Java中的引用,都指向了同一個(gè)對象(簡書)。所以此時(shí)二者可用==表示指向了同一對象。

### 參考文章
[==, .equals(), compareTo(), and compare()](http://www.cnblogs.com/CoolRandy/articles/3676695.html)

總結(jié)

以上是生活随笔為你收集整理的Java 比较(==, equals, compareTo, compare)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。