亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的裝箱與拆箱是什么意思

發布時間:2021-07-24 11:54:21 來源:億速云 閱讀:242 作者:chen 欄目:編程語言

這篇文章主要介紹“Java中的裝箱與拆箱是什么意思”,在日常操作中,相信很多人在Java中的裝箱與拆箱是什么意思問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中的裝箱與拆箱是什么意思”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、Java數據類型

1、在說裝箱與拆箱之前,先說一下Java的基本數據類型,Java從數據類型上可以劃分為值類型與引用類型,值類型是四類八種,分別是:

  •  整數型:byte?,short?,int?,long

  •  浮點型:?oat,double

  •  字符型:char

  •  布爾型:boolean

數據類型內存默認值包裝類
byte8位0Byte
short16位0short
int32位0Integer
long64位0L或0lLong
float32位0.0F或0.0fFloat
double64位0.0D或0.0dDouble
char16位\u0000Character
boolean8位flaseBoolean

2、引用類型:

  •  數組

  •  類(class)

  •  接口(Interface)

  •  枚舉(enum)

Java中的裝箱與拆箱是什么意思

3、值類型與引用類型的區別

 1.  從概念方面上來說:

  •  值類型:變量名指向具體的值

  •  引用類型:變量名指向數據對象的內存地址

 2.  從內存構建方面上來說:

  •  值類型:變量在聲明之后,Java就會立刻分配給它內存空間

  •  引用類型:它以特殊的方式(類似C指針)指向對象實體,這類變量聲明時不會分配內存,只是存儲

 3.  從使用方面上來說:

  •  值類型:使用時需要賦具體值,判斷時用 ” == “號

  •  引用類型:使用時可以賦null,判斷時使用 equals 方法

二、Java數據類型轉換

1、自動轉換

  •     定義:程序在執行過程中“悄然”進行的轉換,不需要用戶提前聲明,一般是從位數低的類型向位數高的類型轉換

  •     優先關系:按從低到高的順序轉換。不同類型數據間的優先   關系如下:

    •  低--------------------------------------------->高

    •  byte,short,char-> int -> long -> float -> double

  •  轉換規則:

  運算中,不同類型的數據先轉化為同一類型,然后進行運算 

操作數1類型操作數2類型轉換后的類型
byte、short、charintint
byte、short、char、intlonglong
byte、short、char、int、longfloatfloat
byte、short、char、int、long、floatdoubledouble

2、強制轉換

  •  定義:強制類型轉換則必須在代碼中聲明,轉換順序不受限制

  •  格式:在需要轉型的數據前加上“( )”,然后在括號內加入需要轉化的數據類型

  •  結果:精度可能會丟失,也可能更加精確 

int x;   double y;   x = (int)3.14 + (int)5.20  //精度丟失   y = (double)x + (double)8  //精度提升   輸出:x = 8;y = 16.0

三、Java之裝箱與拆箱

1、包裝類

  •  Java是面向對象語言,號稱萬事萬物皆對象,因此,8種基本數據類型有了對應的類,這就是包裝類

2、什么是裝箱與拆箱

  •  裝箱:將值類型裝換成引用類型的過程

  •  拆箱:將引用類型轉換成值類型的過程

  •  自動裝箱:   

int x = 3;     Integer y = x;  //int --> Integer,Integer y = x <==> Integer y = Integer.valueOf(x)
  •  自動拆箱:   

Integer x = new Integer(5);     int y = x;  //Integer --> int,int y = x <==> int y = x.intValue()

3、裝箱和拆箱是如何實現的

  •  裝箱過程是通過調用包裝器的valueOf方法實現的

  •  拆箱過程是通過調用包裝器的 xxxValue方法實現的。(xxx代表對應的基本數據類型)

4、注意點:

  1. 鴻蒙官方戰略合作共建——HarmonyOS技術社區

  2.  大量使用自動拆裝箱會使性能降低,還會造成大量的內存消耗

  3.  在重載方法中,可能出現問題 

List<Integer> list = new ArrayList<>();    Integer x,y,z;    x = 1;y = 2;z = 4;    list.add(x);list.add(y);list.add(z);    list.remove(2);

Java中的裝箱與拆箱是什么意思

在上面這段代碼中ArrayList.remove方法有兩個重載方法,那么list.remove(2)是調用了哪個方法,remove掉的是值為2的對象,還是remove了index為2,值為4的那個對象呢?

在這種情況下,編譯器不會進行自動拆裝箱,所以調用的是remove(int index),index為2值為4的這個Integer對象會被remove.

如果要調用 remove(Object o)的方法,應該這么寫 list.remove(y)

  3.  緩存值問題

  •  案例解析:   

Integer i1 = 100;     Integer i2 = 100;     Integer i3 = 200;     Integer i4 = 200;     System.out.println(i1==i2);     System.out.println(i3==i4);     Output: true false
  •  觀察源碼:

  Intteger.valueOf方法 

public static Integer valueOf(int i) {          if (i >= IntegerCache.low && i <= IntegerCache.high)              return IntegerCache.cache[i + (-IntegerCache.low)];          return new Integer(i);      }

IntegerCache類 

private static class IntegerCache {        static final int low = -128;         static final int high;         static final Integer cache[];         static {             // high value may be configured by property             int h = 127;             String integerCacheHighPropValue =                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");             if (integerCacheHighPropValue != null) {                 try {                     int i = parseInt(integerCacheHighPropValue);                     i = Math.max(i, 127);                     // Maximum array size is Integer.MAX_VALUE                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);                 } catch( NumberFormatException nfe) {                     // If the property cannot be parsed into an int, ignore it.                 }             }             hhigh = h;             cache = new Integer[(high - low) + 1];             int j = low;             for(int k = 0; k < cache.length; k++)                 cache[k] = new Integer(j++);             // range [-128, 127] must be interned (JLS7 5.1.7)             assert IntegerCache.high >= 127;         }         private IntegerCache() {}     }

從源碼可以看出,在通過valueOf方法創建Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象的引用;否則創建一個新的Integer對象

  •  Byte、Short、Integer、Long四種包裝類默認創建了數值為[-128,127]的相應類型的緩存數據,但是超出此范圍仍會創建新的對象。

  •  Character默認會創建[0,127]的響應類型的緩存數據

  •  兩種浮點型沒有實現常量池技術,在某個范圍內的整型數值的個數是有限的,而浮點數卻不是   

包裝類常量池常量池范圍
Byte存在[-128,127]
Short存在[-128,127]
Integer存在[-128,127]
Long存在[-128,127]
Character存在[0,127]
Float不存在
Double不存在
  •  注意點:

    •   當 "=="運算符的兩個操作數都是 包裝器類型的引用,則是比較指向的是否是同一個對象,而如果其中有一個操作數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程)

    •  對于包裝器類型,equals方法并不會進行類型轉換

    •  算術運算會觸發裝箱與拆箱過程 

到此,關于“Java中的裝箱與拆箱是什么意思”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巫溪县| 明光市| 融水| 涟水县| 陕西省| 云龙县| 曲沃县| 宁城县| 黄骅市| 永德县| 洪江市| 巴林右旗| 漾濞| 利辛县| 宁强县| 金山区| 连南| 潜江市| 大渡口区| 清水河县| 光泽县| 拉孜县| 西宁市| 双城市| 遂川县| 海安县| 杭州市| 襄汾县| 内丘县| 皋兰县| 昌黎县| 延庆县| 青龙| 松潘县| 古丈县| 营口市| 岢岚县| 勐海县| 桑植县| 铁岭市| 普宁市|