Java中==和equals的區(qū)別灾螃,equals和hashCode的區(qū)別

一、Java中==和equals的區(qū)別

1.==

1)"=="如果比較的是基本數(shù)據(jù)類型(byte short char boolean int long double float),對(duì)比的是值虽界,因此是相等的炫加,例如

int num1 = 34;

int num2 = 34;

char c1 = 'a';

char c2 = 'a';

char c3 = 'b';

System.out.println("num1 == num2: "+(num1 == num2));

System.out.println("c1 == c2: "+(c1 == c2));

System.out.println("c1 == c3: "+(c1 == c3));

結(jié)果:

num1 == num2: true

c1 == c2: true

c1 == c3: false

2)如果比較的是對(duì)象則對(duì)比的是對(duì)象的地址值,例如

String s1 = new String("hello");

String s2 = new String("hello");

String s3 = "hello";

String s4 = "hello";

System.out.println("s1 == s2: "+(s1 == s2));

System.out.println("s1 == s3: "+(s1 == s3));

System.out.println("s2 == s3: "+(s2 == s3));

System.out.println("s3 == s4: "+(s3 == s4));

結(jié)果:

s1 == s2: false

s1 == s3: false

s2 == s3: false

s3 == s4: true

2.equals

1)對(duì)于字符串常量來(lái)說(shuō)泻轰,equals比較的是對(duì)象兩邊的內(nèi)容技肩,如果內(nèi)容相同則返回true

String s1 = new String("hello");

String s2 = new String("hello");

String s3 = "hello";

String s4 = "hello";

System.out.println("s1.equals(s2): "+s1.equals(s2));

System.out.println("s1.equals(s3): "+s1.equals(s3));

System.out.println("s3.equals(s4): "+s3.equals(s4));

結(jié)果:

s1.equals(s2): true

s1.equals(s3): true

s3.equals(s4): true

2)如果比較的是非字符型變量,equals比較的是內(nèi)存的首地址值浮声,此時(shí)和"=="是一樣的虚婿,既比較兩邊指向的是不是同一個(gè)對(duì)象

Person p1 = new Person("xiaomi", 8);

Person p2 = new Person("xiaomi", 8);

System.out.println("p1.equals(p2): "+p1.equals(p2));

public static class Person{

? ? String name;

? ? int age;

? ? public Person(String name, int age){}

}

結(jié)果:

p1.equals(p2): false

二、equals和hashCode的區(qū)別

在java中任何一個(gè)對(duì)象都具有equals和hashCode兩種方法泳挥,因?yàn)樗鼈兌际窃贠bject類中定義的然痊,equals用來(lái)判斷兩個(gè)對(duì)象是否相同,如果相同則返回true羡洁,如果不相同則返回false玷过。hashCode則是返回一個(gè)int數(shù)值,在Object類中的默認(rèn)實(shí)現(xiàn)是“將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)返回”。

官方說(shuō)明:

在 Java 應(yīng)用程序執(zhí)行期間辛蚊,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí)粤蝎,必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒(méi)有被修改袋马。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行初澎,該整數(shù)無(wú)需保持一致。?

如果根據(jù) equals(Object) 方法虑凛,兩個(gè)對(duì)象是相等的碑宴,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。?

以下情況不 是必需的:如果根據(jù) equals(java.lang.Object) 方法桑谍,兩個(gè)對(duì)象不相等延柠,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。但是锣披,程序員應(yīng)該知道贞间,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。?

實(shí)際上雹仿,由 Object 類定義的 hashCode 方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)增热。(這一般是通過(guò)將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來(lái)實(shí)現(xiàn)的,但是 JavaTM 編程語(yǔ)言不需要這種實(shí)現(xiàn)技巧胧辽。)?

當(dāng)equals方法被重寫時(shí)峻仇,通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定邑商,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼摄咆。

如果之重寫了equals或者h(yuǎn)ashCode方法而沒(méi)有重寫另外一個(gè)方法,可能會(huì)導(dǎo)致數(shù)據(jù)缺失

一之重寫equal為例奠骄,重寫hanshCode類似

public class HashCodeTest {

? ? public static void main(String [] args){

? ? ? ? HashSet set = new HashSet();

? ? ? ? Point p1 = new Point(1,1);

? ? ? ? Point p2 = new Point(1,1);

? ? ? ? System.out.println(p1.equals(p2));

? ? ? ? set.add(p1);

? ? ? ? set.add(p2);

? ? ? ? set.add(p1);

? ? ? ? Iterator iterator = set.iterator();

? ? ? ? while (iterator.hasNext()){

? ? ? ? ? ? Object o = iterator.next();

? ? ? ? ? ? System.out.println(o);

? ? ? ? }

? ? }

? ? public static class Point{

? ? ? ? int x;

? ? ? ? int y;

? ? ? ? public Point(int x, int y){

? ? ? ? ? ? super();

? ? ? ? ? ? this.x = x;

? ? ? ? ? ? this.y = y;

? ? ? ? }

? ? ? ? @Override

? ? ? ? public boolean equals(Object o) {

? ? ? ? ? ? if (this == o){

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? } else if (o == null){

? ? ? ? ? ? ? ? return false;

? ? ? ? ? ? } else if (getClass()? != o.getClass()){

? ? ? ? ? ? ? ? return false;

? ? ? ? ? ? }

? ? ? ? ? ? Point p = (Point) o;

? ? ? ? ? ? if (x != p.x || y != p.y){

? ? ? ? ? ? ? ? return false;

? ? ? ? ? ? }

? ? ? ? ? ? return super.equals(o);

? ? ? ? }

? ? ? ? @Override

? ? ? ? public String toString() {

? ? ? ? ? ? return "x: "+x+" , y: "+y;

? ? ? ? }

? ? }

}

輸出:

false

x: 1 , y: 1

x: 1 , y: 1

總結(jié):

1.hashCode是為了提高散結(jié)構(gòu)存儲(chǔ)中查找的效率豆同,在線性表表中沒(méi)有作用

2.若要重寫,equals和hashCode需要同時(shí)覆蓋

3.若equals為true含鳞,則hashCode一定相等

4.若equal返回值為false影锈,hashCode不一定不相等

5.如hashCode相等,equals不一定為true

6.若hashCode不相等蝉绷,則equals一定不相等

7.同一對(duì)象在執(zhí)行期間若已經(jīng)存儲(chǔ)在集合中鸭廷,則不能修改影響hashCode值的相關(guān)信息,否則會(huì)導(dǎo)致內(nèi)存泄露熔吗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辆床,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桅狠,更是在濱河造成了極大的恐慌讼载,老刑警劉巖轿秧,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咨堤,居然都是意外死亡菇篡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門一喘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驱还,“玉大人,你說(shuō)我怎么就攤上這事凸克∫轶。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵萎战,是天一觀的道長(zhǎng)咐容。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蚂维,這世上最難降的妖魔是什么疟丙? 我笑而不...
    開(kāi)封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鸟雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘览祖。我一直安慰自己孝鹊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布展蒂。 她就那樣靜靜地躺著又活,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锰悼。 梳的紋絲不亂的頭發(fā)上柳骄,一...
    開(kāi)封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音箕般,去河邊找鬼耐薯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丝里,可吹牛的內(nèi)容都是我干的曲初。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杯聚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼臼婆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起幌绍,我...
    開(kāi)封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颁褂,失蹤者是張志新(化名)和其女友劉穎故响,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颁独,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彩届,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奖唯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惨缆。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丰捷,靈堂內(nèi)的尸體忽然破棺而出坯墨,到底是詐尸還是另有隱情,我是刑警寧澤病往,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布捣染,位于F島的核電站,受9級(jí)特大地震影響停巷,放射性物質(zhì)發(fā)生泄漏耍攘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一畔勤、第九天 我趴在偏房一處隱蔽的房頂上張望蕾各。 院中可真熱鬧,春花似錦庆揪、人聲如沸式曲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吝羞。三九已至,卻和暖如春内颗,著一層夾襖步出監(jiān)牢的瞬間钧排,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工均澳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恨溜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓找前,卻偏偏與公主長(zhǎng)得像筒捺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纸厉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法系吭,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法颗品,繼承相關(guān)的語(yǔ)法肯尺,異常的語(yǔ)法沃缘,線程的語(yǔ)...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • java中String的常用方法 1、length()字符串的長(zhǎng)度 例:char chars[]={'a','b'...
    赤赤有名閱讀 2,050評(píng)論 0 10
  • 從網(wǎng)上復(fù)制的则吟,看別人的比較全面槐臀,自己搬過(guò)來(lái),方便以后查找氓仲。原鏈接:https://www.cnblogs.com/...
    lxtyp閱讀 1,345評(píng)論 0 9
  • 傍晚清風(fēng)微起水慨,沐浴月光。這次想說(shuō)說(shuō)我的夢(mèng)想敬扛,我是一個(gè)沖動(dòng)而又安穩(wěn)的小女生晰洒,我傲嬌,想要什么都跟別人不一樣啥箭,我幻想谍珊,...
    雪姐姐閱讀 815評(píng)論 0 0
  • 王菲說(shuō),只是因?yàn)樵谌巳褐屑苯模豢戳艘谎燮鲋停驮僖膊荒芡裟闳蓊仭C總€(gè)人都希望自己能從人群中坏怪,被快速辨認(rèn)出來(lái),可往往總是...
    隔壁村的教主閱讀 15,253評(píng)論 6 53