在Java字符串那些事兒一文發(fā)表后,朋友給我留言說(shuō):比較字符串用equals不就完了唄舍沙,干嘛要用"=="朵栖,吃飽了撐的砾省,能不能來(lái)點(diǎn)實(shí)際的。其實(shí)在文章里我是想表明混槐,Java字符串兩種聲明方式在堆內(nèi)存中不同的體現(xiàn)编兄,我們?cè)趯懘a過(guò)程中,為了避免重復(fù)的創(chuàng)建對(duì)象声登,盡量使用String s1 ="123" 而不是String s1 = new String("123")狠鸳,因?yàn)镴VM對(duì)前者給做了優(yōu)化。
那么悯嗓,我們今天來(lái)說(shuō)說(shuō)equels件舵,話不多說(shuō),上代碼:
執(zhí)行一下脯厨,結(jié)果如下:
面試題中老問(wèn)"=="與和equals有什么區(qū)別铅祸,甚至連百度搜索equals也會(huì)自動(dòng)關(guān)聯(lián)出equals和"=="的區(qū)別這一類的問(wèn)題來(lái)。
筆者一直認(rèn)為合武,這兩者之間沒(méi)有必然的聯(lián)系临梗,在引用類型中,"=="是比較兩個(gè)引用是否指向堆內(nèi)存里的同一個(gè)地址(同一個(gè)對(duì)象)稼跳,而equals是一個(gè)普通的方法盟庞,該方法返回的結(jié)果依賴于自身的實(shí)現(xiàn)。我們先看一下Person這個(gè)類汤善,并沒(méi)有equals方法呀什猖,那為什么不報(bào)錯(cuò)呢?在Java中红淡,如果一個(gè)類沒(méi)有繼承其它類不狮,那么它默認(rèn)繼承Object這個(gè)類,打開Object這個(gè)類看一下在旱,發(fā)現(xiàn)如下代碼摇零,Person這個(gè)類的equals方法就繼承自這里
很簡(jiǎn)單,就一句代碼颈渊,判斷兩個(gè)引用是否指向同一個(gè)對(duì)象遂黍,兩個(gè)Person對(duì)象在堆內(nèi)存中的表現(xiàn)如下圖所示:
所以代碼person1.equals(person2)等同于person1 == person2,當(dāng)然打印出來(lái)的結(jié)果是false俊嗽。我們?cè)賮?lái)看看Integer這個(gè)類雾家, equals的實(shí)現(xiàn)如下:
當(dāng)代碼執(zhí)行到System.out.println(itr.equals(lon))時(shí),會(huì)判斷傳入的lon這個(gè)對(duì)象是否是Integer類型绍豁,這里的lon是Long類型芯咧,所以打印出來(lái)的結(jié)果當(dāng)然是false了。
最后是我們String的實(shí)現(xiàn)
當(dāng)代碼執(zhí)行到:System.out.println(s3.equals(s4)),由于字符串底層char數(shù)組里存的都是{'1','0','0'}當(dāng)然打印出來(lái)是true了敬飒。
轉(zhuǎn)載出自:https://zhuanlan.zhihu.com/p/27573287