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.mzph.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; 关于…

私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦投资区块链&#xff0c;猛戳&#xff1a;火星财经App下载来源&#xff1a;学习区块链原文标题&#xff1a;「…

关于List集合类ArrayList、LinkedList、Vector详解

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

关于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…

“毕业季”|一个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知识点速览&#…

【Swagger】看这一篇就够了

各位小伙伴们大家好&#xff0c;欢迎跟着小扎扎一起学习【Swagger】这门技术&#xff0c;在本片博客中我对B站狂神的Swagger教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Swagger知识点…

用python画大雄_python制作斗图生成器

网上各种带文字的表情图片都被大家玩坏了&#xff0c;今天就和大家一起用 python 亲自做一个带字表情图片生成器。 不知道大家有没有看到网上有很多人都在说 "人生苦短&#xff0c;我用 python"&#xff0c;这句话我之前也不是很理解&#xff0c;觉得人生苦短和用pyt…

【spring cloud】(一)使用idea创建可相互调用的多模块应用

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;spr…

python字符串百分号_Python字符串格式化的2种方法

本文介绍了Python字符串格式化&#xff0c;主要有两种方法&#xff0c;分享给大家&#xff0c;具体如下 用于字符串的拼接&#xff0c;性能更优。 字符串格式化有两种方式&#xff1a;百分号方式、format方式。 百分号方式比较老&#xff0c;而format方式是比较先进的&#xff…

【踩坑,已解决】spring cloud删除子模块后创建同名模块时遇到的删除不净,java、resources包失效,java、resources包被标记为模块等问题

&#x1f4a1;问题速览&#x1f4cc; 问题复现&#x1f4cc; 没有任何操作&#xff0c;model又出现了&#x1f4cc; 模块重建后java、resources包失效&#x1f4cc; 模块重建后java、resources包被标记为了模块&#x1f4cc; 问题复现 本人是在跟着B站尚硅谷的视频练习Spring c…

蓝牙扫描过程解析_智慧定位系统之蓝牙网关在室内定位技术的原理浅析-新导智能...

蓝牙室内定位技术是利用在室内安装的若干个蓝牙局域网接入点&#xff0c;把网络维持成根据多用户的基础网络连接形式&#xff0c;并确保蓝牙局域网接入点始终是这个微网的主设备&#xff0c;然后经过丈量信号强度对新加入的盲节点进行三角定位。苏州新导实时定位体系(RTLS)和室…