int和Integer的比较
int和Integer的比較
1 int和Integer
JDK1.5引入了自動裝箱與自動拆箱功能,Java可根據上下文,實現int/Integer,double/Double,boolean/Boolean等基本類型與相應對象之間的自動轉換,為開發過程帶來極大便利。
最常用的是通過new方法構建Integer對象。但是,基于大部分數據操作都是集中在有限的、較小的數值范圍,在JDK1.5 中新增了靜態工廠方法 valueOf,其背后實現是將int值為-128 到 127 之間的Integer對象進行緩存,在調用時候直接從緩存中獲取,進而提升構建對象的性能,也就是說使用該方法后,如果兩個對象的int值相同且落在緩存值范圍內,那么這個兩個對象就是同一個對象;當值較小且頻繁使用時,推薦優先使用整型池方法(時間與空間性能俱佳)。
2 注意事項
[1] 基本類型均具有取值范圍,在大數*大數的時候,有可能會出現越界的情況。
[2] 基本類型轉換時,使用聲明的方式。例:long result= 1234567890 * 24 * 365;結果值一定不會是你所期望的那個值,因為1234567890 * 24已經超過了int的范圍,如果修改為:long result= 1234567890L * 24 * 365;就正常了。
[3] 慎用基本類型處理貨幣存儲。如采用double常會帶來差距,常采用BigDecimal、整型(如果要精確表示分,可將值擴大100倍轉化為整型)解決該問題。
[4] 優先使用基本類型。原則上,建議避免無意中的裝箱、拆箱行為,尤其是在性能敏感的場合,
[5] 如果有線程安全的計算需要,建議考慮使用類型AtomicInteger、AtomicLong 這樣的線程安全類。部分比較寬的基本數據類型,比如 float、double,甚至不能保證更新操作的原子性,可能出現程序讀取到只更新了一半數據位的數值。
對象由三部分組成,對象頭,對象實例,對齊填充。
其中對象頭一般是十六個字節,包括兩部分,第一部分有哈希碼,鎖狀態標志,線程持有的鎖,偏向線程id,gc分代年齡等。第二部分是類型指針,也就是對象指向它的類元數據指針,可以理解,對象指向它的類。
對象實例就是對象存儲的真正有效信息,也是程序中定義各種類型的字段包括父類繼承的和子類定義的,這部分的存儲順序會被虛擬機和代碼中定義的順序影響(這里問一下,這個被虛擬機影響是不是就是重排序??如果是的話,我知道的volatile定義的變量不會被重排序應該就是這里不會受虛擬機影響吧??)。
第三部分對齊填充只是一個類似占位符的作用,因為內存的使用都會被填充為八字節的倍數。
總結
以上是生活随笔為你收集整理的int和Integer的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下nand flash驱动工作
- 下一篇: MySQL 基础 ———— 子查询