【JAVA-Day06】Java 基本数据类型转换、自动装箱和自动拆箱

在这里插入图片描述
在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

摘要

在Java编程中,我们经常需要处理基本数据类型的转换以及包装类的使用。本文将深入探讨这些概念,包括为什么要进行基本数据类型转换、自动类型转换和强制类型转换,以及自动装箱和自动拆箱的工作原理。我们还将比较基本数据类型和包装类的性能差异,以帮助您在实际开发中做出明智的选择。

引言

在Java编程中,处理数据类型是一个常见的任务。有时候,我们需要将一个数据类型转换为另一个数据类型,有时候需要使用包装类来操作基本数据类型。了解如何进行数据类型转换以及何时使用包装类是Java开发中的重要知识点。

本文将从以下几个方面深入探讨这些概念:

  1. 为什么要进行基本数据类型转换?
  2. 自动类型转换(隐式转换)
  3. 强制类型转换(显式转换)
  4. 自动装箱和自动拆箱
  5. 性能比较:基本数据类型 vs. 包装类

1. 为什么要进行基本数据类型转换?

在学习基本数据类型转换之前,首先要了解为什么要进行基本数据类型转换

作为一门强类型的编程语言,Java要求在不同数据类型之间进行转换时,需要进行手动或自动转换。

例如,byte 的数据范围是-128到127。如果将数值128直接赋值给 byte 类型的数据,编译器会报错,因为超出了数据范围。示例如下:

 public class Main {
    public static void main(String[] args) {
        int a = 128;
        byte b = (byte) a;
        System.out.println("答案 = " + b);
    }
}

最终输出结果为:答案 = -128。因为128超过了 byte 的数据范围,重新计数赋值,第一个值为 -128

通过以上示例,只需简单了解为什么要进行数据类型转换即可。即只要参与运算的基本数据类型不一致时,就会发生数据类型的转换

Java中基本数据类型的转换主要分为两类:

  • 自动转换类型(隐式转换)
  • 强制转换类型(显示转换)

接下来我们将逐一讲解。

1.1 自动类型转换(隐式转换)

自动类型转换,顾名思义就是自动进行数据类型转换,由Java编译器进行自动处理,Java代码不需要经过任何处理。

小类型到大类型是自动提升的,即小类型变量可以赋值给大类型变量。例如:

 public class Main {
    public static void main(String[] args) {
        long a = 1;
    }
}

数值 1int 类型,而承载的变量为 long 类型,所以数值 1 会被自动转换为 1L

1.2 强制类型转换(显示转换)

大类型转为小类型时,需要强制类型转换,这可能会导致数据丢失。

例如,int 类型的取值范围是 -2^312^31-1,而 byte 类型的取值范围是 -2^72^7-1

当将 int 类型转换为 byte 类型时,会发生数据溢出的情况。示例代码如下:

 public class Main {
    public static void main(String[] args) {
        int a = 128;
        byte b = (byte) a;
        System.out.println("b = " + b);
    }
}

最终输出的结果为 b = -128,即发生了数据溢出情况,也可以理解为数据丢失。

同样,在 double 类型强制转换为 int 时,也会出现数据精度丢失的情况。示例代码如下:

 public class Main {
    public static void main(String[] args) {
        double a = 3.1415926;
        int b = (int) a;
        System.out.println("b = " + b);
    }
}

输出结果为 b = 3,即发生了数据精度丢失情况,也可以理解为数据丢失。

2. 自动装箱和自动拆箱

在学习自动装箱和自动拆箱之前,首先了解什么是包装类。

2.1 包装类是什么?

在 JDK 1.4 中,新增了 8 个基本数据类型的对应包装类,如下表所示:

基本类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

基本数据类型的对应包装类的方式基本相同,但在 JVM 上的分配有所不同。包装类的主要作用是在需要使用对象而不是基本数据类型的情况下使用,例如在定义集合时。

2.2 为什么要用包装类?

从 JDK 1.5 开始,定义集合需要使用包装类。定义普通数组,使用基本类型和包装类都可以,如下代码所示:

 public class Main {
    public static void main(String[] args) {
        /**
         * 普通数组的定义方法
         */
        int[] a = new int[10];
        /**
         * 集合的定义方法
         */
        List<Integer> arr = new ArrayList<>();
        /**
         * 对基本类型的集合定义需要转为包装类
         */
        // List<int> arr = new ArrayList<>(); // 编译错误
    }
}

包装类的使用场景主要是在需要将基本数据类型转换为对象时,例如在集合中。否则,建议使用基本数据类型以提高性能和节省内存。

2.3 自动装箱

自动装箱(Autoboxing)和自动拆箱(Unboxing)是Java语言中的特性,用于方便地在基本数据类型和对应的包装类之间进行转换。

自动装箱是指将基本数据类型自动转换为对应的包装类型,这使得编程更加方便,无需手动进行类型转换。在你提供的示例代码中,以下三种方式都是实现自动装箱的方式:

直接赋值:Integer a = 666;
使用包装类的静态工厂方法:Integer b = Integer.valueOf(666);
构造器赋值(已被废弃):Integer c = new Integer(666);

这些方式都可以将基本数据类型 666 转换成对应的包装类型 Integer,从而使得你可以在需要包装类型的地方使用它们。

2.4 自动拆箱(Unboxing)

自动拆箱是指将包装类型自动转换为对应的基本数据类型,也使得编程更加方便。在你提供的示例中,自动拆箱的示例是:

Integer a = 666;
int b = 666;

在这里,变量 a 是包装类型 Integer,但在进行比较时,它会自动拆箱为基本数据类型 int,然后与 b 进行比较。这使得你可以像比较两个基本数据类型一样比较包装类型,而不需要显式地调用 intValue() 方法等。

总之,自动装箱和自动拆箱是Java语言中的便利特性,它们使得基本数据类型和包装类型之间的转换更加容易,减少了编码的复杂性。
如果不进行自动拆箱,两个不同类型的变量无法进行比较

3. 性能比较

通过性能比较,我们可以看到使用基本数据类型的性能要优于使用包装类。因此,在实际开发中,建议使用基本数据类型

如果必须使用包装类的场景下,再去使用包装类。

3.1 测试基本数据类型

首先对基本数据类型进行测试,示例代码如下:

 public class Main {
    private static final long MAX_NUMBER = 1000000000;

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        long sum = 0;
        for (long i = 0; i < MAX_NUMBER; i++) {
            sum += i;
        }
        long end = System.currentTimeMillis();

        System.out.printf("耗时 = " + (end - start) + ",计算结果 = " + sum);
    }
}

最终输出结果:

耗时 = 304,计算结果 = 499999999500000000

3.2 测试包装类

接着对包装类进行测试,示例代码如下:

 public class Main {
    private static final Long MAX_NUMBER = 1000000000L;

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Long sum = 0L;
        for (Long i = 0L; i < MAX_NUMBER; i++) {
            sum += i;
        }
        long end = System.currentTimeMillis();

        System.out.printf("耗时 = " + (end - start) + ",计算结果 = " + sum);
    }
}

最终输出结果:

cmd复制代码耗时 = 6374,计算结果 = 499999999500000000

总结

在本文中,我们深入探讨了Java中的基本数据类型转换、自动装箱和自动拆箱。我们了解了为什么需要进行基本数据类型转换以及自动类型转换和强制类型转换的概念。我们还探讨了包装类的作用以及自动装箱和自动拆箱的工作原理。最后,我们通过性能比较强调了在实际开发中选择基本数据类型的重要性。希望这些知识对您在Java编程中有所帮助。

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默 语

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值