==和Equals區(qū)別

對于基本數(shù)據(jù)類型:(byte、short休涤、char咱圆、int笛辟、float功氨、double、long手幢、boolean)捷凄,比較的是值。

他們是作為常量在方法區(qū)中的常量池里面以HashSet策略存儲起來的围来,對于這樣的字符串 "123" 也是相同的道理跺涤,在常量池中,一個常量只會對應(yīng)一個地址监透,因此不管是再多的 123桶错,"123" 這樣的數(shù)據(jù)都只會存儲一個地址,所以所有他們的引用都是指向的同一塊地址胀蛮,因此基本數(shù)據(jù)類型和String常量是可以直接通過==來直接比較的院刁。

對于引用數(shù)據(jù)類型,有equals和==兩種比較方法粪狼。

什么是==?

== 等于比較運算符退腥,如果進(jìn)行比較的兩個操作數(shù)都是數(shù)值類型,即使他們的數(shù)據(jù)類型不相同再榄,只要他們的值相等狡刘,也都將返回true。如果兩個操作數(shù)都是引用類型困鸥,那么只有當(dāng)兩個引用變量的類型具有父子關(guān)系時才可以比較嗅蔬,而且這兩個引用必須指向同一個對象,才會返回true(在這里我們可以理解成==比較的是兩個變量的內(nèi)存地址)。

什么是equals()?

equals()方法是Object類的方法购城,在Object類中的equals()方法體內(nèi)實際上返回的就是使用==進(jìn)行比較的吕座。但是我們知道所有的類都繼承Object,而且Object中的equals()方法沒有使用final關(guān)鍵字修飾瘪板,那么當(dāng)我們使用equal()方法進(jìn)行比較的時候吴趴,我們需要關(guān)注的就是這個類有沒有重寫Object中的equals()方法。
如果自己所寫的類中已經(jīng)重寫了equals方法侮攀,那么就按照用戶自定義的方式來比較倆個對象是否相等锣枝,如果沒有重寫過equal方法,那么會調(diào)用父類(Object)中的equals方法進(jìn)行比較兰英,也就是比較地址值撇叁。

JVM把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存畦贸。
 ≡赡帧①在函數(shù)中定義的一些基本類型的變量和對象的引用變量(變量名)都在函數(shù)的棧內(nèi)存中分配。
 ”』怠②當(dāng)在一段代碼塊定義一個變量時趋厉,Java就在棧中為這個變量分配內(nèi)存空間,當(dāng)超過變量的作用域后胶坠,Java會自動釋放掉為該變量所分配的內(nèi)存空間君账,該內(nèi)存空間可以立即被另作他用。
 ∩蛏啤③堆內(nèi)存用來存放由new創(chuàng)建的對象(包括由基本類型包裝起來的類:Integer乡数、String、Double闻牡,實際上每個基本類型都有他的包裝類)和數(shù)組净赴。

Object類中的equals方法:

public boolean equals(Object obj) {
return (this == obj);
}

可以看出Object類中equals方法是用==判斷對象引用是否指向同一內(nèi)存地址。

String源碼講解

image

舉例

Stringst1="hello";
Stringst2="hello";
System.out.println(st1==st2);//true
st1.equals(st2);//true

講解:String類型罩润,它已經(jīng)實現(xiàn)了重寫玖翅,比較的時候,先比較當(dāng)前對象的地址和要比較的對象的地址是否相等哨啃,若相等烧栋,則返回true,則拳球,提前結(jié)束比較审姓。
如果不相等,則判斷是否為String的實例化對象祝峻,如果是魔吐,在判斷長度是否相等扎筒,再判斷數(shù)組的每個值,字母是否相等酬姆。如果都相等嗜桌,則返回true。

上面的判斷當(dāng)執(zhí)行String s1 = “hello”辞色;這條語句時骨宠,會在堆中的字符常量池里找”hello”這個字符串,若沒有找到相满,則將”hello”這個字符串放入字符串常量池中层亿。而在棧中開辟一塊名為s1的空間存放”hello”,這塊空間的引用立美。當(dāng)執(zhí)行String s2 = “hello”匿又;這條語句時,會在堆中的字符串常量池里找”hello”這個字符串建蹄,很顯然可以找到碌更,于是便把字符常量里”hello”這個字符串的引用地址賦給s2,因此s1與s2存放的都是堆中字符常量池中的同一個”hello”的引用洞慎。

Stringst2="hello";
Stringst3=newString("hello");
System.out.println(st2==st3);//false  因為重現(xiàn)new出來的痛单,就會重新開辟一塊地址,所以比較的的是引用的地址值拢蛋, false

st1.equals(st2);//true 因為String已經(jīng)重寫了equals方法桦他,比較的是值蔫巩,則相等

Stringsss1=newString("aaa");
Stringsss2=newString("aaa");
System.out.println(sss1==sss2);//false
System.out.println(sss1.equals(sss2));// true

sss1和sss2都為new出來的對象谆棱,各占有一塊內(nèi)存空間,所以內(nèi)存地址不同圆仔,但是字符串內(nèi)容相同垃瞧。

StringBufferstringBuffer=newStringBuffer("aaa");
StringBufferstringBuffer2=newStringBuffer("aaa");
System.out.println(stringBuffer==stringBuffer2);// false
System.out.println(stringBuffer.equals(stringBuffer2));// false

非String類,例如StringBuffer類 沒有重寫equals方法坪郭,所以不比較內(nèi)容个从。==和equals都是比較的內(nèi)存地址。

區(qū)別

== 是java提供的等于比較運算符歪沃,用來比較兩個變量指向的內(nèi)存地址是否相同嗦锐。而equals()是Object提供的一個方法。Object中equals()方法的默認(rèn)實現(xiàn)就是返回兩個對象==的比較結(jié)果沪曙。但是equals()可以被重寫奕污,所以我們在具體使用的時候需要關(guān)注equals()方法有沒有被重。

通俗一點液走,我們需要記住的就是==比較的是內(nèi)存地址碳默,是java提供的比較運算符贾陷,而equals()方法是Object中提供的方法,是可以被重寫的嘱根,你也可以自己重寫髓废,所以在使用equals()方法時應(yīng)該看看此類是如何重寫的,僅此而已该抒。

從==和equals可以引申出equals和hashcode方法的重寫慌洪。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凑保,隨后出現(xiàn)的幾起案子蒋譬,更是在濱河造成了極大的恐慌,老刑警劉巖愉适,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犯助,死亡現(xiàn)場離奇詭異,居然都是意外死亡维咸,警方通過查閱死者的電腦和手機(jī)剂买,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門侣颂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梁剔,“玉大人,你說我怎么就攤上這事碟联∽飧保” “怎么了坐慰?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長用僧。 經(jīng)常有香客問我结胀,道長,這世上最難降的妖魔是什么责循? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任糟港,我火速辦了婚禮,結(jié)果婚禮上院仿,老公的妹妹穿的比我還像新娘秸抚。我一直安慰自己,他們只是感情好歹垫,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布剥汤。 她就那樣靜靜地躺著,像睡著了一般排惨。 火紅的嫁衣襯著肌膚如雪吭敢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天若贮,我揣著相機(jī)與錄音省有,去河邊找鬼痒留。 笑死,一個胖子當(dāng)著我的面吹牛蠢沿,可吹牛的內(nèi)容都是我干的伸头。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼舷蟀,長吁一口氣:“原來是場噩夢啊……” “哼恤磷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起野宜,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤扫步,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匈子,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體河胎,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年虎敦,在試婚紗的時候發(fā)現(xiàn)自己被綠了游岳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡其徙,死狀恐怖胚迫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唾那,我是刑警寧澤访锻,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站闹获,受9級特大地震影響期犬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昌罩,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一哭懈、第九天 我趴在偏房一處隱蔽的房頂上張望灾馒。 院中可真熱鬧茎用,春花似錦、人聲如沸睬罗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽容达。三九已至古涧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間花盐,已是汗流浹背羡滑。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工菇爪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柒昏。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓凳宙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親职祷。 傳聞我的和親對象是個殘疾皇子氏涩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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