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);
}
相关文章
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
19天前
|
JSON 前端开发 Java
【Bug合集】——Java大小写引起传参失败,获取值为null的解决方案
类中成员变量命名问题引起传送json字符串,但是变量为null的情况做出解释,@Data注解(Spring自动生成的get和set方法)和@JsonProperty
|
1月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
137 1
|
1月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
59 2
|
1月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
60 2
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
58 4
|
2月前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
119 5
|
1月前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
50 3
|
1月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
2月前
|
Java API 数据库
Java 反射机制:动态编程的 “魔法钥匙”
Java反射机制是允许程序在运行时访问类、方法和字段信息的强大工具,被誉为动态编程的“魔法钥匙”。通过反射,开发者可以创建更加灵活、可扩展的应用程序。
54 2