Java包裝類、java中的方法傳參機制:按值調用

在這里插入圖片描述

??各位小伙伴們大家好,歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄,在這個系列專欄中我將記錄淺學這本書所得收獲,鑒于 看到就是學到、學到就是賺到 精神,這波簡直就是血賺

💡涉及的知識點速通

  • 🛫 方法的參數傳遞機制是什么?
    • 🪂 基本數據類型作參數
    • 🪂 引用數據類型作參數
  • 🛫 關于包裝類你都知道什么?
    • 🪂 包裝類基本知識
    • 🪂 什么是裝箱和拆箱?
    • 🪂 包裝類cache緩存機制

🛫 方法的參數傳遞機制是什么?

??方法的參數分為基本數據類型和引用數據類型,基本數據類型就是前面說過的四類八種,具體都有什么可以參考下面這篇博客的🛫 強制and自動類型轉換都是啥?這個問題部分,在Java中除了這四類八種的基本數據類型之外都是引用數據類型

在答題之前先介紹一下相關概念

??參數傳遞機制的兩個專業術語:按值調用 表示方法接收到的是調用者提供的值;按引用調用 表示方法接收到的是調用者提供的變量地址
??方法參數的兩種形式:實參 就是方法調用的時候方法名后面的括號里的數據;形參 方法聲明的時候方法名后面的括號里的數據,這就相當于一種局部變量,只在它定義的這個方法內部有效

🪂 基本數據類型作參數

??基本數據類型的參數采用按值調用的傳遞機制,也就是說方法調用的時候傳過去的是一個值,但是實參并沒有作為這個值傳遞過去,而是將實參的副本傳遞過去,方法中對形參的所有操作都是對實參副本的操作,并不會更改實參的實際值在這里插入圖片描述

🪂 引用數據類型作參數

??引用數據類型的參數也是采用按值調用的傳遞機制,也就是說方法調用的時候傳過去的也是一個值,一個實參的副本在這里插入圖片描述??但是看上面代碼的運行結果,許多小伙伴是不是就懵了,不是說傳過去的是一個實參的副本嘛,為什么實參的結果值也互換了呢?別急,仔細想一想,數組是一個引用數據類型也就是說是一個對象,那么實參的arr是個什么?當然是這個數組對象的引用地址了,那么傳遞的副本也就是這個引用地址的副本,形參按照這個引用地址的副本對數組進行操作,當然也就按照地址操作了實參所對應的對象的值了。這么一來是不就是可以解釋的通了

??綜上所述,Java中方法的參數傳遞機制只有按值調用,并沒有按引用調用

🛫 關于包裝類你都知道什么?

🪂 包裝類基本知識

數據類型包裝類儲存空間(byte)大小
byteByte1字節8位
shortShort2字節16位
intInteger4字節32位
longLong8字節64位
floatFloat4字節32位
doubleDouble8字節64位
charCharacter2字節16位
booleanBoolean1字節8位

🚩每一個基本數據類型都有一個對應的包裝類,前六個類派生于公共的超類Number
🚩包裝類是不可變的,也即是說一旦構造了包裝器,就不允許更改它的值,與此同時包裝類還是final修飾的,因此不能派生他們的子類
🚩泛型也必須聲明成包裝類型,而不能使用基本數據類型
🚩包裝類的值比較需要使用equals方法,而不是==判斷

🪂 什么是裝箱和拆箱?

??Java主張一切皆對象的思想,但是基本數據類型并不是對象,于是就有了包裝類的概念。其中裝箱就是將一個基本數據類型包裝成其對應的包裝類,拆箱就是反過來將包裝類拆成對應的基本數據類型數據。根據轉換時是否使用方法,裝箱又稱為自動拆裝箱和手動拆裝箱

??手動裝箱有兩種方式:使用包裝類構造器、包裝類的valueOf方法;手動拆箱有一種:包裝類的xxxValue方法。但是Java提供了自動拆裝箱,如果二者相互復賦值的話就會自動轉換而無需使用方法進行轉換,且使用泛型定義的集合添加基本數據類型的時候也會自動裝箱為對應的包裝類型

🚩裝箱和拆箱是編譯器的工作在這里插入圖片描述

🪂 包裝類cache緩存機制

??從Java5開始,包裝類新增了自動拆、裝箱的功能,除此之外還新增了cache緩存機制,該機制會將取值在一定范圍內的值創建成相應的對象緩存起來,這些緩存起來的對象在以后使用到的時候就可以直接用,這樣就可以避免在這個范圍內的值重復創建造成的內存損耗從而降低性能。為了更好的了解這個機制,讓我們看一下接下來的這段代碼寫下自己的答案,然后結合cache機制的解釋再推測一下答案,最終結果在后面給出在這里插入圖片描述??這里通過源碼(下面給出),以Integer為例來了解一下包裝類的cache緩存機制,Integer類中有一個IntegerCache類,這個類的主要作用即就是創建[-128,127]之間的所有對象并添加到cache數組中,等到調用valueOf方法的時候就使用if判斷是不是在范圍內,如果在的話就直接在cache數組中直接返回,反之就使用構造器創建一個對應的Integer對象返回

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint 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_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = 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() {}
}public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

??但是你可能就會有疑問了,如果我就使用一次包裝類的話,它也會緩存創建范圍內的所有對象,這樣的話怎么實現節省內存提升性能呢?當然,包裝類的cache緩存機制是針對大程序而言的概念,小程序并不能很好地體現。于是當確定同值對象使用的次數很少時,我們就可以使用構造器來創建包裝類對象,因為緩存類只能通過valueOf方法才會生效
??你可能又有疑問了,使用自動裝箱直接賦值的形式創建包裝類對象會不會使用到緩存呢?答案是 會,因為自動裝箱底層就是調包裝類對應的valueOf方法,那么你是怎么確定的呢?對自動裝箱和自動拆箱代碼編譯生成的字節碼文件進行反編譯得出下面的內容,根據12和19行得知:自動裝箱調用的是valueOf方法,自動拆箱調用的是intValue方法

public class com.example.demo.code.AutoPacking {java.lang.Integer i1;int i2;public com.example.demo.code.AutoPacking();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: iconst_16: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;9: putfield      #3                  // Field i1:Ljava/lang/Integer;12: aload_013: new           #4                  // class java/lang/Integer16: dup17: iconst_218: invokespecial #5                  // Method java/lang/Integer."<init>":(I)V21: invokevirtual #6                  // Method java/lang/Integer.intValue:()I24: putfield      #7                  // Field i2:I27: return
}

通過上面的分析,我們就可以很容易的得出上面那段代碼的答案了在這里插入圖片描述

包裝類的緩存范圍

數據類型包裝類緩存范圍
整型Byte、Short、Long、Integer[-128,127]
浮點型Float、Double
字符型Character[0,127]
布爾型Booleantrue、false

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535015.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535015.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

尤克里里怎么樣_尤克里里和吉他區別?尤克里里與吉他相比有什么不可替代的優勢...

尤克里里和吉他有什么區別&#xff1f;想必大家都見過尤克里里吧&#xff0c;就是類似吉他形狀的一種小型弦撥樂器。我們可以簡單的認為&#xff1a;尤克里里是簡化版本的吉他&#xff0c;更加簡單&#xff0c;更加便宜。小編彈的就是尤克里里2.從外觀上&#xff1a;吉他很大&a…

餓漢懶漢單例設計模式的使用及區別、java中的import關鍵字

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

廣電運通不好進嗎_我可以說鄭州新風的安裝大部分都是垃圾嗎?

說鄭州的新風安裝都是垃圾&#xff0c;這話很無禮&#xff0c;很自大&#xff0c;很傲慢&#xff0c;但是我能說確實是這樣嘛&#xff1f;其實包括我以前安裝的也不合格——雖然我不是故意的。這幾年見過許多家同行安裝的新風&#xff0c;可以說目前見到的很多家都不合格&#…

Java迭代器和Collection接口

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

atlas安裝需要kafka嗎_Atlas 2.1.0 實踐(2)—— 安裝Atlas

在完成Atlas編譯以后&#xff0c;就可以進行Atlas的安裝了。Atlas的安裝主要是安裝Atlas的Server端&#xff0c;也就Atlas的管理頁面&#xff0c;并確保Atlas與Kafka Hbase Solr等組件的集成。Atlas的系統架構如下&#xff0c;在確保 底層在完成Atlas編譯以后&#xff0c;就可以…

ue4中隱藏燈光和相機圖標_[HDRP]物理燈光是什么?科普向

HDRP拋棄了Bulitin的燈光&#xff0c;改用物理單位以及物理屬性。那么物理燈光到底是什么&#xff1f;請點贊評論來支持作者&#xff0c;提前祝大家新年快樂。https://connect.unity.com/p/hdrp-wu-li-deng-guang-shi-shi-yao-ke-pu-xiang?connect.unity.com同步更新unity con…

私鑰經過哈希計算可以產生公鑰_「區塊鏈基礎概念100」:公鑰和私鑰 | 027

免責聲明&#xff1a;本文旨在傳遞更多市場信息&#xff0c;不構成任何投資建議。文章僅代表作者觀點&#xff0c;不代表火星財經官方立場。小編&#xff1a;記得關注哦投資區塊鏈&#xff0c;猛戳&#xff1a;火星財經App下載來源&#xff1a;學習區塊鏈原文標題&#xff1a;「…

關于List集合類ArrayList、LinkedList、Vector詳解

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

1562a檢測軟件_洛達1562a空間音頻版評測!!!

哈嘍大家好&#xff01;這里是小澤&#xff0c;一個不專業的Beatboxer~~~今天給大家帶來一期HQB最新空間音頻版洛達1562a耳機的評測視頻&#xff0c;建議先贊再看&#xff01;&#xff08;滑稽&#xff09;聽說你不點贊&#xff1f;昨晚拍了一晚&#xff0c;但是因為是第一次搞…

python 趣味編程課_青少年編程:Python趣味編程基礎入門課程

課程目錄 章節1:編程課前說明試看 課時1 編程課前說明07:49可試看 章節2:第一章 Python基礎-認識環境試看 課時2 1、什么是計算機程序和編程&#xff1f;08:48可試看 課時3 2、為什么學習編程&#xff1f;03:10可試看 課時4 3、Python的安裝11:48可試看 課時5 4、用Python編寫第…

shell181網格劃分_ANSYS中Shell181單元介紹誰知道

再畢業設計做模型中要應用到SHELL181單元&#xff0c;那么這個單元有什么好處誰能具體的告訴我下&#xff0c;我有英文但是有的地方翻譯不通。或者誰能幫我翻譯一下~謝謝~SHELL181issuitableforanalyzingth...再畢業設計做模型中要應用到SHELL181單元&#xff0c;那么這個單元有…

關于Set集合類你都知道什么?來自《卷Ⅰ》的靈魂提問

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

流程圖虛線框表示什么_UI設計|APP的交互線框布局設計

一.流程圖設計流程圖(Flow Chart)&#xff1a;用圖示的方式反映出特定主體為了滿足特定需求而進行的有特定邏輯關系的一系列操作過程。流程圖的四種基本結構&#xff1a;順序結構&#xff0c;條件結構(又稱選擇結構)&#xff0c;循環結構&#xff0c;分支結構。1.流程圖的常用符…

使用Redis完成商品秒殺業務

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

表格列隱藏_【excel每日提升】Excel隱藏列,不讓別人打開!

【新朋友】點擊標題下面藍色字“王俊東“關注。 【老朋友】點擊右上角&#xff0c;轉發或分享本頁面內容。excel系列課程excel特效系列課程開始了&#xff0c;今天第2節&#xff01;第1節&#xff1a;Excel有公式的單元格標記顏色&#xff0c;很簡單&#xff01;第2節&#xf…

map與weakmap,ES6 Map和WeakMap有什么區別?

Looking this and this MDN pages it seems like the only difference between Maps and WeakMaps is a missing "size" property for WeakMaps. But is this true? Whats the difference between them?解決方案The experienced JavaScript programmer will notice…

“畢業季”|一個java開發實習生的OFFER之路

哈嘍哈嘍大家好&#xff0c;這里是小扎扎的博客。相信有關注過我的好盆友們可能會發現我已經有一段時間沒有出來劃水了&#xff0c;那么這段時間小扎扎都在干什么呢&#xff1f;沒錯&#xff01;我確實是去找實習了&#xff01;接下來就給大家介紹一下本次戰役的戰況如何 活動地…

virtualbox 該內存不能為written_系統提示“該內存不能為read”的原因和解決辦法...

我們單位的電腦經常顯示這個對話框&#xff0c;已經有好幾年了&#xff0c;單位的老頭們都不怎么懂電腦&#xff0c;我本人也不愛管閑事。但是出現這種對話框的原因是什么呢&#xff1f;又怎么解決呢&#xff1f;一般電腦經常出現藍屏和死機&#xff0c;而且頻繁出現。有時會出…

插件properties_Mybatis3系列 - 4. mybatis-config的properties屬性詳解

前兩章簡單的講解了MyBatis的使用方式. 接下來先全局的說一下MyBatis的全局的xml配置詳細說明.XML格式定義-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">configuration 的映射文件(根據定義順序說明)properties 屬性…

【Redis 6】秒殺業務——分布式鎖

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…