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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java谜题:等于,还是不等于?

發布時間:2025/7/14 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java谜题:等于,还是不等于? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

等于還是不等于?

先來看下面的一段代碼:?

???代碼片段1

  • public?static?void?main(final?String[]?args)?{??
  • ????Integer?a?=?new?Integer(100);??
  • ????Integer?b?=?100;??
  • ????System.out.println(a?==?b);???
  • }???
  • ?這段代碼的輸出是什么?相信很多人都會很容易的猜到:false,因為a、b兩個對象的地址不同,用“==”比較時是false。恭喜你,答對了。

    ?再看下面的一段代碼:

    ???? 代碼片段2

  • public?static?void?main(final?String[]?args)?{??
  • ????Integer?a?=?100;??
  • ????Integer?b?=?100;??
  • ????System.out.println(a?==?b);???
  • }??
  • ?你可能會回答,這沒什么不一樣啊,所以還是false。很遺憾,如果你執行上面的一段代碼,結果是true。

    ?上面的代碼可能讓你有些意外,那好吧,再看看下面的這段代碼:

    ?????代碼片段3

  • public?static?void?main(final?String[]?args)?{??
  • ????Integer?a?=?156;??
  • ????Integer?b?=?156;??
  • ????System.out.println(a?==?b);???
  • }??
  • ?結果是true嗎?很遺憾,如果你執行上面的一段代碼,結果是false。

    ??感到吃驚嗎?那最后再看下面的一段代碼:

    ???? 代碼片段4

  • public?static?void?main(final?String[]?args)?{??
  • ????Integer?a?=?Integer.valueOf(100);??
  • ????Integer?b?=?100;??
  • ????System.out.println(a?==?b);???
  • }??
  • 最后的結果,可能你已經猜到了,是true。

    為什么會這樣?

    現在我們分析一下上面的代碼。可以很容易的看出,這一系列代碼的最終目的都是用“==”對兩個對象進行比較。Java中,如果用“==”比較兩個對象結果為true,說明這兩個對象實際上是同一個對象,false說明是兩個對象。?

    現在,我們來看看為什么會出現上面的現象。?

    我們先看代碼片段4:最后的運行結果是true,說明a、b兩個對象實際上是同一個對象。但是a對象是通過調用Integer的valueOf方法創建的,而b對象是通過自動裝箱創建出來的,怎么會是同一個對象呢?難道問題在字節碼那里,畢竟Java程序是依靠虛擬器運行字節碼來實現的。?

    通過jdk中自帶的工具javap,解析字節碼,核心的部分摘取如下:

  • 0:??bipush??100??
  • 2:??invokestatic????#16;?//Method?java/lang/Integer.valueOf:(I)Ljava/lang/Integer;??
  • 5:??astore_1??
  • 6:??bipush??100??
  • 8:??invokestatic????#16;?//Method?java/lang/Integer.valueOf:(I)Ljava/lang/Integer;??
  • 代碼中我們只調用了一次Integer.valueOf方法,但是字節碼中出現了兩次對Integer.valueOf方法的調用。那么另一次是哪里呢?只可能在自動裝箱時調用的。因此這段代碼實際上等價于:

  • public?static?void?main(final?String[]?args)?{??
  • ????Integer?a?=?Integer.valueOf(100);??
  • ????Integer?b?=?Integer.valueOf(100);??
  • ????System.out.println(a?==?b);???
  • }??
  • ?現在問題就簡單了:看jdk源代碼,查看valueOf方法的具體實現:

  • public?static?Integer?valueOf(int?i)?{??
  • ????final?int?offset?=?128;??
  • ????if?(i?>=?-128?&&?i?<=?127)?{?//?must?cache???
  • ????????return?IntegerCache.cache[i?+?offset];??
  • ????}??
  • ????return?new?Integer(i);??
  • }??
  • ?看到這兒,上面的代碼就很明確了:對于-128到127的數字,valueOf返回的是緩存中的對象。所以兩次調用Integer.valueOf(100)返回的都是同一個對象。

    我們再先看代碼片段3:根據上面的分析,代碼片段3實際上等價于以下代碼:

  • public?static?void?main(final?String[]?args)?{??
  • ????Integer?a?=?Integer.valueOf(156);??
  • ????Integer?b?=?Integer.valueOf(156);??
  • ????System.out.println(a?==?b);???
  • }??
  • ?由于156不在-128到127范圍內,所以兩個對象都是通過new Integer()的方式創建的,所以最后結果為false。?

    ?片段1和片段2就不做具體分析了,相信讀者可以自行分析。

    ??最后,請大家思考一下問題:通過上面的分析,了解到整數的自動裝箱是通過Integer.valueOf(int number)實現的,那么自動拆箱是如何實現的呢?

    原文鏈接:http://www.blogjava.net/todayx-org/archive/2012/02/01/369115.html

    轉載于:https://blog.51cto.com/htgylzhq/800875

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Java谜题:等于,还是不等于?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。