Java包装类、方法传参机制都有什么值得注意的?来自《卷Ⅰ》的灵魂提问(一)

简介: Java包装类、方法传参机制都有什么值得注意的?来自《卷Ⅰ》的灵魂提问(一)

🛫 方法的参数传递机制是什么?

 方法的参数分为基本数据类型和引用数据类型,基本数据类型就是前面说过的四类八种,具体都有什么可以参考下面这篇博客的🛫 强制and自动类型转换都是啥?这个问题部分,在Java中除了这四类八种的基本数据类型之外都是引用数据类型


在答题之前先介绍一下相关概念


 参数传递机制的两个专业术语:按值调用 表示方法接收到的是调用者提供的值;按引用调用 表示方法接收到的是调用者提供的变量地址

 方法参数的两种形式:实参 就是方法调用的时候方法名后面的括号里的数据;形参 方法声明的时候方法名后面的括号里的数据,这就相当于一种局部变量,只在它定义的这个方法内部有效


🪂 基本数据类型作参数

 基本数据类型的参数采用按值调用的传递机制,也就是说方法调用的时候传过去的是一个值,但是实参并没有作为这个值传递过去,而是将实参的副本传递过去,方法中对形参的所有操作都是对实参副本的操作,并不会更改实参的实际值

image.png


🪂 引用数据类型作参数

 引用数据类型的参数也是采用按值调用的传递机制,也就是说方法调用的时候传过去的也是一个值,一个实参的副本

image.png 但是看上面代码的运行结果,许多小伙伴是不是就懵了,不是说传过去的是一个实参的副本嘛,为什么实参的结果值也互换了呢?别急,仔细想一想,数组是一个引用数据类型也就是说是一个对象,那么实参的arr是个什么?当然是这个数组对象的引用地址了,那么传递的副本也就是这个引用地址的副本,形参按照这个引用地址的副本对数组进行操作,当然也就按照地址操作了实参所对应的对象的值了。这么一来是不就是可以解释的通了


 综上所述,Java中方法的参数传递机制只有按值调用,并没有按引用调用


🛫 关于包装类你都知道什么?

🪂 包装类基本知识

数据类型 包装类 储存空间(byte) 大小

byte Byte 1字节 8位

short Short 2字节 16位

int Integer 4字节 32位

long Long 8字节 64位

float Float 4字节 32位

double Double 8字节 64位

char Character 2字节 16位

boolean Boolean 1字节 8位

🚩每一个基本数据类型都有一个对应的包装类,前六个类派生于公共的超类Number

🚩包装类是不可变的,也即是说一旦构造了包装器,就不允许更改它的值,与此同时包装类还是final修饰的,因此不能派生他们的子类

🚩泛型也必须声明成包装类型,而不能使用基本数据类型

🚩包装类的值比较需要使用equals方法,而不是==判断


🪂 什么是装箱和拆箱?

 Java主张一切皆对象的思想,但是基本数据类型并不是对象,于是就有了包装类的概念。其中装箱就是将一个基本数据类型包装成其对应的包装类,拆箱就是反过来将包装类拆成对应的基本数据类型数据。根据转换时是否使用方法,装箱又称为自动拆装箱和手动拆装箱


 手动装箱有两种方式:使用包装类构造器、包装类的valueOf方法;手动拆箱有一种:包装类的xxxValue方法。但是Java提供了自动拆装箱,如果二者相互复赋值的话就会自动转换而无需使用方法进行转换,且使用泛型定义的集合添加基本数据类型的时候也会自动装箱为对应的包装类型


🚩装箱和拆箱是编译器的工作

image.png

🪂 包装类cache缓存机制

 从Java5开始,包装类新增了自动拆、装箱的功能,除此之外还新增了cache缓存机制,该机制会将取值在一定范围内的值创建成相应的对象缓存起来,这些缓存起来的对象在以后使用到的时候就可以直接用,这样就可以避免在这个范围内的值重复创建造成的内存损耗从而降低性能。为了更好的了解这个机制,让我们看一下接下来的这段代码写下自己的答案,然后结合cache机制的解释再推测一下答案,最终结果在后面给出  

image.png这里通过源码(下面给出),以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 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.
            }
        }
        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);
}
相关文章
|
12天前
|
Java
Java——方法的引用
方法引用允许将已有方法作为函数式接口的实现。使用“::”符号,需具备函数式接口,被引用的方法须存在且参数和返回值需与抽象方法一致。其分类包括:静态方法引用(类::方法名)、成员方法引用(对象::方法名、this::方法名、super::方法名)和构造方法引用(类名::new)。方法引用提高了代码的简洁性和可读性,减少了样板代码。
29 13
Java——方法的引用
|
8天前
|
Java
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
本文介绍了Java中抽象类和抽象方法的使用,以及ArrayList的基本操作,包括添加、获取、删除元素和判断列表是否为空。
13 2
java基础(12)抽象类以及抽象方法abstract以及ArrayList对象使用
|
12天前
|
Java 程序员
深入理解Java异常处理机制
【9月更文挑战第20天】在Java编程世界中,异常处理是一项基础而重要的技能。本文将通过通俗易懂的语言和生动的比喻,带你走进Java异常的世界,了解它们的本质、分类以及如何优雅地处理这些不请自来的特殊“客人”。从简单的try-catch语句到复杂的异常链追踪,我们将一步步揭开异常处理的面纱,让你在遇到问题时不再手足无措。
41 21
|
1天前
|
Java 程序员 开发者
深入理解Java中的异常处理机制
【9月更文挑战第31天】在Java编程中,异常处理是维护程序健壮性的关键。本文将通过浅显易懂的语言和生动的例子,带你了解Java异常处理的基本概念、分类以及如何优雅地处理它们。从初学者到资深开发者,每个人都能从中获得新的洞见和技巧,让你的代码更加健壮和易于维护。
10 4
|
4天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
14 4
|
4天前
|
Java 数据库连接
深入理解Java异常处理机制
【9月更文挑战第28天】在Java编程中,异常处理是确保程序健壮性的关键。本文通过浅显易懂的语言和生动的例子,带你一步步了解Java的异常处理机制。从try-catch-finally的基本用法,到自定义异常类,再到异常处理的最佳实践,我们将一起探索如何在代码中优雅地处理那些不期而遇的小插曲。
13 4
|
6天前
|
安全 Java API
Java根据URL获取文件内容的实现方法
此示例展示了如何安全、有效地根据URL获取文件内容。它不仅展现了处理网络资源的基本技巧,还体现了良好的异常处理实践。在实际开发中,根据项目需求,你可能还需要添加额外的功能,如设置连接超时、处理HTTP响应码等。
37 4
|
6天前
|
Java 程序员 数据库连接
Java中的异常处理机制:理解与实践
本文将深入探讨Java语言中异常处理的核心概念、重要性以及应用方法。通过详细解析Java异常体系结构,结合具体代码示例,本文旨在帮助读者更好地理解如何有效利用异常处理机制来提升程序的健壮性和可维护性。
|
8天前
|
安全 Java
java调用方法
java调用方法
18 4
|
7天前
|
Java 开发者 UED
深入理解Java中的异常处理机制
本文旨在通过通俗易懂的语言,详细解析Java异常处理的核心概念及应用。从异常的基本分类到具体处理方法,再到最佳实践和常见误区,一步步引领读者深入理解这一关键技术,提升编程质量和效率。
15 2
下一篇
无影云桌面