隔着超薄肉丝进入小说_男女刺激性视频大片_女教师的诱波多野结衣_一级欧美过瘾大片

當前位置: 首頁 / 技術干貨 / 正文
好程序員Java培訓分享int和Integer的區別

2020-08-05

Java培訓

  好程序員Java培訓分享intInteger的區別,在說intInteger的區別之前,先要弄清楚兩個問題:

  一、Java基本數據類型及其封裝類

  二、Java自動拆箱和自動裝箱

  Java自動拆箱和自動裝箱

  1、自動裝箱

  自動裝箱其實就是將基本數據類型轉換為引用數據類型(對象)

  2、自動拆箱

  自動拆箱其實就是將引用數據類型轉化為基本數據類型

  int Integer的區別

  分析

  int

  Integer

  int Integer 的區別

  相同值下的 int Integer 的比較結果

  分析

  int

  int Java的基本數據類型。

  Integer

  Integer 繼承了Object類,是對象類型,是 int 的包裝類。

  int Integer 的區別

  值的存儲

  int 存儲在棧中

  Integer 對象的引用存儲在棧空間中,對象的數據存儲在堆空間中。

  初始化

  int 初始化值為0

  Integer 初始化值為null

  傳參

  int 是值傳遞,棧中的數據不可變。

  Integer 對象是引用傳遞,引用不可變,但是引用指向的堆空間地址中的值是可以改變的。

  泛型支持

  泛型不支持int,但是支持Integer

  運算

  int 可以直接做運算,是類的特性。

  Integer 的對象可以調用該類的方法,但是在拆箱之前不能進行運算,需要轉化為基本類型int

  int是基本數據類型,Integer是引用數據類型;

  int默認值是0Integer默認值是null

  int類型直接存儲數值,Integer需要實例化對象,指向對象的地址。

  相同值下的 int Integer 的比較結果

  兩個通過new生成的變量,結果為false

  int Integer 的值比較,若兩者的值相等,則為true

  (注意:在比較時,Integer會自動拆箱為int類型,然后再做比較。)

  new 生成的Integer變量 和 非new 生成的Integer變量比較,,結果為false

  (注意:new 生成的Integer變量的值在堆空間中,非new 生成的Integer變量的值在在常量池中。)

  (注意:非new生成的Integer變量,會先判斷常量池中是否有該對象,若有則共享,若無則在常量池中放入該對象;也叫享元模式,后面再說。)

  兩個非new 生成的Integer對象比較,則結果為true

  (注意:此處需要一個前提:值的范圍在 -128 ~ 127 之間。

  涉及到Java int Integer 的自動裝箱和拆箱的一種模式:享元模式—flyweight,為了加強對簡單數字的重復利用。

  在賦值時,其實是執行了IntegervalueOf()方法。

  當值在 -128 ~ 127之間時,Java會進行自動裝箱,然后會對值進行緩存,如果下次再有相同的值,會直接在緩存中取出使用。緩存是通過Integer的內部類IntegerCache來完成的。

  當值超出此范圍,會在堆中new出一個對象來存儲。

  PS:自動裝箱與拆箱是在JDK1.5中出現的。

  )

  內部類IntegerCache

  通過此類可以緩存簡單數字。

  緩存的數大小可以由 -XXAutoBoxCacheMax = 控制。

  jvm初始化時,Java.lang.Integer.IntegerCache.high屬性可以設置并保存在私有系統屬性中。

  規定了low屬性的值:-128

  來看個例子

1

  1a == b 嗎? 廢話,肯定不相等。兩個new出來的對象地址不一樣。

  2c == d 嗎? 這個也是廢話,都是基本數據類型的值肯定相等。

  3:現在的關鍵問題是 e == f 嗎? g == h 嗎?

  答案是:e == f; g != h。為什么會出現這種情況?因為ava在進行編譯時 Integer g = 130會被編譯成 Integer.valueOf(130) ,這個可以通過反編譯class文件看到。而通過Integer源碼可以得出,Integer.valueOf() 方法會在數值-128~127之間會對Integer進行緩存,不會再重新new一個,所以 e==f ;當數值二大于127或者小于-128的時候則會重新new一個,所以g != h

  IntegervalueOf方法如下

2

  4c == e 嗎, i == j 嗎?

  答案都是相等的。因為封裝類和基本數據類型進行比較的時候,Java會自動拆箱,然后比較數值是 否相等。

  綜上,我們可以得出幾個結論:

  1、都是封裝類,都是new出來的,肯定不相等。因為對象的內存地址不一樣。

  2、都是封裝類,都不是new出來的,如果值在-128~127之間,那就相等,否則不相等。

  3、如果是封裝類和基本類型進行比較,只要數值相等那就相等,否則就不相等。因為封裝類和基本數據類型進行比較的時候會有一個自動拆箱操作。

  4、都是基本數據類型,如果數值相等,那就相等;否則不相等。

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數據+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發 <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數據分析 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發 <高端班>

    開班時間:2021-07-12(北京)

    預約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓IT培訓
在線咨詢
IT培訓IT培訓
試聽
IT培訓IT培訓
入學教程
IT培訓IT培訓
立即報名
IT培訓

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號