• [Java开发之路](23)装箱与拆箱


    1. 简单介绍

    大家对基本数据类型都很熟悉。比如 int、float、double、boolean、char 等。基本数据类型是不具备对象的特性,比方基本类型不能调用方法、功能简单。

    。。,为了让基本数据类型也具备对象的特性, Java 为每一个基本数据类型都提供了一个包装类,这样我们就能够像操作对象那样来操作基本数据类型。

    对象包装类是不变的,即一旦构造了包装类,就不同意更改包装在当中的值。

    同一时候,对象包装类还是final,因此不能定义它们的子类。

    如果想定义一个整型数组列表,而尖括号里的类型參数不同意是基本类型的。也就是说。不同意写成ArrayList<int>。这里用到了对象包装类。我们能够声明一个Integer对象的数组列表。

    1. ArrayList<Integer> list = new ArrayList<Integer>();

    备注:

    ArrayList<Integer>的效率远远低于int[] 数组,可是还是使用ArrayList。其原因就是程序猿操作的方便性运行效率更加重要。

    进行例如以下操作:

    1. list.add(3);

    将自己主动转换为:

    1. list.add(Integer.valueOf(3));

    这样的变换就是自己主动装箱

    相反的,当将一个Integer对象赋予一个int值时,将会自己主动拆箱:

    1. int n = list.get(i)

    将自己主动转换为:

    1. int n = list.get(i).intValue();


    备注:

    装箱与拆箱是编译器认可的,而不是虚拟机

    编译器在生成类的字节码时,插入必要的方法调用。

    虚拟机仅仅是运行这些字节码。

    使用数值对象包装类有一个优点:

    能够将某些基本方法放置在包装类中。

    1. int x = Integer.parseInt(s);
    这里与Integer对象一点关系也没有,parseInt仅仅是一个静态方法,可是Integer类是放置这种方法的一个好去处。


    2. 分类

    装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自己主动装箱

    1. package com.qunar.test;
    2. public class HelloWorld {
    3. public static void main(String[] args) {
    4. // 定义一个int基本类型值
    5. int num = 14;
    6. // 手动装箱
    7. Integer x = new Integer(num);
    8. // 自己主动装箱
    9. Integer y = num;
    10. System.out.println("x->"+x+" y->"+y);
    11. }
    12. }

    拆箱:和装箱相反。把包装类对象转换成基本类型的值,又可分为手动拆箱和自己主动拆箱

    1. package com.qunar.test;
    2. public class HelloWorld {
    3. public static void main(String[] args) {
    4. // 定义一个Integer包装类
    5. Integer integer = new Integer(8);
    6. // 手动拆箱
    7. int x = integer.intValue();
    8. // 自己主动拆箱
    9. int y = integer;
    10. System.out.println("x->"+x+" y->"+y);
    11. }
    12. }

    3. 分析

    自己主动装箱的弊端:

    自己主动装箱有一个问题。那就是在一个循环中进行自己主动装箱操作的情况,如以下的样例就会创建多余的对象,影响程序的性能:

    1. Integer sum = 0;
    2. for(int i=1000; i<5000; i++){
    3.   sum+=i;
    4. }

    上面的代码sum+=i能够看成sum = sum + i。可是+这个操作符不适用于Integer对象,首先sum进行自己主动拆箱操作。进行数值相加操作,最后发生自己主动装箱操作转换成Integer对象。其内部变化例如以下:

    1. sum = sum.intValue() + i;
    2. Integer sum = new Integer(result);

    因此在我们编程时,须要注意到这一点。正确地声明变量类型。避免由于自己主动装箱引起的性能问题。



  • 相关阅读:
    数据类型及转换
    进制转换
    精通libGDX-RPG开发实战
    github上最好的开源MMORPG
    同步mysql数据到ElasticSearch的最佳实践
    在libGDX中使用Spine骨骼动画
    window下Kafka最佳实践
    linux 系统的负载与CPU、内存、硬盘、用户数监控脚本[marked]
    源码安装cmake(或者叫升级cmake)
    Rust-HayStack
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7241394.html
Copyright © 2020-2023  润新知