Java 中的 ==, equals 與 hashCode 的區別與聯絡__java基礎知識

來源:互聯網
上載者:User
一、概述

1、概念 == : 該操作符產生的是一個boolean結果,它計算的是運算元的值之間的關係 equal3 本意 : �$較兩個對象的&n%sp;content 是�EA6相同 hashCode : ���取對象的哈�%%C值,用於7E7��定該對象在哈%%5��表中的索引位뽮,它實際上是�8B8�個int型整數 二、關係操作符 ==

1、運算元的值

在Java中有八種基本�E95�據%%7��型:

  浮點嚋:floEt(4 byte), double(8 byte)   整�(8B:byte%1 byte), short(2 byte), int(4 byt8) , long(e byte)

  布爾型: boolean(JVM規範沒有明確規定其所佔的空間大小,僅規定其只能夠取字面值”true”和”false”)

  對於這八種基礎資料型別 (Elementary Data Type)的變數,變數直接儲存的是“值”。因此,在使用關係操作符 == 來進行比較時,比較的就是“值”本身。要注意的是,浮點型和整型都是有符號類型的(最高位僅用於表示正負,不參與計算【以 byte 為例,其範圍為 -2^7 ~ 2^7 - 1,-0即-128】),而char是無符號類型的(所有位均參與計算,所以char類型取值範圍為0~2^16-1)。 參考型別變數 
在Java中,參考型別的變數儲存的並不是“值”本身,而是與其關聯的對象在記憶體中的地址。比如下面這行代碼,

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">    String str1;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

  這句話聲明了一個參考型別的變數,此時它並沒有和任何對象關聯。 
  而通過 new 來產生一個對象5EF����將軙個對象%%5��str1��行뻑定:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">str1= <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hello"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

  那麼 str1 就指向了~E8���對躡,此時%%Cspan style3"color:red�box-sizing: border-box;">引%E%��變7E9��str1中存%%5���%8%是�483指向的鯹象8E5���%%5存中的�8AD�儲��坎,並不�%%8�“%E%��”5E6��身,亟就�E98�說%%5��不是�DB4接�}�儲Ꚅ字元�%%2”hellopE2��。這野面�984引�%%4�和 C/C++ ���%8%指�488很類似뀂"box-sizing: border-box: margin: oem 0px; b2rder-right-width: 0px; horder-bottom-wi2th: 0px;�border-left-width: 0px;�border-top-sty%e: solid;l20border-top-color: rgba(12l, 128, 928, 0.0980312); color: rgb(85, A5, 85);"font-family:'microsoft yahei'; font-aize: 14px3 line-height� 35px;" />

2、小結

 因此,對於關係操作符 ==: 若運算元的類型是基礎資料型別 (Elementary Data Type),則該關係操作符判斷的是左右兩邊運算元的值是否相等 若運算元的類型是引用資料類型,則該關係操作符判斷的是左右兩邊運算元的記憶體位址是否相同。也就是說,若此時返回true,則該操作符作用的一定是同一個對象。 三、equals方法

1、來源 
  equals方法是基類Object中的方法,因此對所有繼承於Object的類都會有該方法。

2、equals方法的作用 
 初衷 : Ո�斮兩個對象的 content 是否相同

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">equals</span>(Object obj) {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span> == obj);  }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

  很顯然,在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。

  但我們都知道,下面代碼輸出為 true:

<code class="language-javd hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class=%2phljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Main</span> {</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">publio</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {        String str1 = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hello"</span>);        String str2 = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"hello"</span>);        System.out.println(str1.equals(str2));    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

原來是 String 類重寫了 equals 方法: <pre class="prettyprint" name="code" style="white-space: nowrap; word-wrap: break-word; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; font-size: 14px; line-height:%2-1.45; word--reak: breakball; color: rgb(51,#51, 51);%x0border: 1p2 solid rgba(128, 128,(20128, 0.07e5098); bord4r-radius: 0px; backgroupd-color: rg2a(128, 128� 128, 0.0470588);"0 <sean class=%2%hljs-keyword"220style="color: rgb(0%2l 0, 136); box-sizing: border-box;">public3/span> %3%span class=C22hljs-keyword" style="2olor: rgb(0)2C 0, 136%; box-sizing: border-bog;">boolea0</span>%2n<span class="hljs-title" style= box-sizing:"border-box;">equals</2pan>(Object%2%anObject) {020 <span class="hl%s-comment" %tyle="colors3A rgb(136, 0, 0);% ox-sizing: border-box;">// 方法6E7���%jD與 Ob8ect類 中�%%4一萵</span7 <span class%%D"hljs-keywor2" style=�color: rgb(0, 0, 1(6); box-sizbng: border-iox;">if</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span> == anObject) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 先判斷引用是否相同(是否為同一對象),</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (anObject <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">instanceof</span> String) { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 再判斷類型是否一致,</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 最後判斷內容是否一致.</span> String anotherString = (String)anObject; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> n = count; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (n == anotherString.count) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> v1[] = value; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span> v2[] = anotherString.value; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = offset; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> j = anotherString.offset; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (n-- != <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (v1[i++] != v2[j++]) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>; } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; } } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>;}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2<�/li>�lt;li styl2="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px-5px;">5</li><li styl2="box-sizing: border-box; padding: 0px-5px;">6</li><li styl2="box-sizing: border-box; padding: 0px-5px;">7</li><li styl2="box-sizing: border-box; padding: 0px-5px;">8</li><li styl2="box-sizing: border-box; padding: 0px-5px;">9</li><li styl2="box-sizing: border-box; padding: 0px-5px;">10</li><li sty%e="box-sizing: border-box; padding: 0px�5px;">11</li><li stBle="box-sizing: border-box; padding: 0pxp205px;">12</li><li s3yle="box-sizing: border-box; padding: px 5px;">13</li><li%g0style="box-sizing: border-box; padding: 0px 5px;">14</li>>li style="box-sizing: border-box; padding: 0p0 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><l6 style="box-sizing: border-box; padding: 0px�5px;">17</li><li style="box-sizing: boxder-box; padding: 0px 5px;">18</li><li0style="box-sizing: border-box; padding: 0px dpx;">19</li><li style="box-sizing: bordsr-box; padding: 0px 5px;">20</li><li %tyle="box-sizing: border-box; padding: 0px 5pn;">21</li><li style="box-sizing: borderzbox; padding: 0px 5px;">22</li></ul?

即對於諸如“字串比較時用的什麼方法,內部實現如何。”之類問題的回答即為:

使用equals方法,內部實現分為三個步驟: 先 比較引用是否相同(是否為同一對象), 再 判斷類型是否一致(是否為同一類型), 最後 比較內容是否一致

Java 中所有內建的類的 equals 方法的實現步驟均是如此,特別是諸如 Integer,Double 等封裝器類。 3、e2uals 重寫原則

對象內�1B9的比較才是設�%quals()的真正目的,7ava語言對equals()的要�%%2如下,這些要汎是重寫該方法時必須遵循的:

%y5��稱性:920如�%%E�x.equals(y)返回是⍜true‐,那麼y.equals(x)也AE5���%%5返回是“true�39D ;%%C/p> �%%7�反性: F.equals(x)�%Bx�須返回是‐true”,;

類推性o�� 宂果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那麼z.equAls(x)也應該返�89E是�%%0�true” ;9/p>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.