zoukankan      html  css  js  c++  java
  • 基本数据类型及包装数据类型

    行文思路:

    1 基本数据类型有哪些?分别是多少个字节?

    2 包装类型与对应的基本数据类型有什么差别?

    3 包装类型和基本数据类型各自在虚拟机的哪些位置?

    4 为什么既要有包装类型,有要有基本类型的存在?【可以用他们的差别看来回答---》回看第二点】

    5 什么时候适合使用包装类型?什么时候适合使用基本类型?

    6 包装类型和基本数据类型的各种类型之间值的比较方式是什么?

    7 拆箱装箱

    ----------------------------------------------------

    1 基本数据类型有哪些以及对应的包装类型?分别是多少个字节?

    数据类型 占用字节数          
    byte[Byte]:1字节 short[Short]:2字节 char[Character]:2字节 int[Integer]:4字节 long[Long]:8字节 flaot[Float]:4字节 double[Double]:8字节
     boolean[Boolean]:对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示。跟虚拟机的规范以及处理器规格【32位还是64位】有关,所以不确定。一个字节或者四个字节,都有可能。可参考:https://blog.csdn.net/dingpf1209/article/details/80259500

    2 包装类型与对应的基本数据类型有什么差别?

     a 包装类型可以为null,基本类型不可以

    因为包装类型可以为null,所以使得包装类型可以应用于POJO【简单无规则的 Java 对象,只有属性字段以及 setter 和 getter 方法】 为什么 POJO 的属性必须要用包装类型呢?

    数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常。
    
                                                                                                                                   --------《阿里巴巴 Java 开发手册》

     b 包装类型可用于泛型,而基本类型不可以

      理由:泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类,但是基本类型不是对象类型。

    c 基本类型比包装类型更高效

     基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。

    d 包装类型是对象的概念,比较的时候要注意==比较的是地址引用,同值不相等的情况,需要equal 重写比较值

    e 自动拆箱和自动装箱【下文会详细提到】

    3 包装类型和基本数据类型各自在虚拟机的哪些位置?

    包装类型其实就是对象,所以很容易想到是在JVM的堆上,对于基本数据类型,要具体看java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接

    java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》
    如果是类的全局变量 class{
    private int i;
    }
    此时的i 不是静态的,不会独立于类的实力而存在,存在堆里面,如果是方法里的基本变量,那就存在虚拟机栈的局部变量表里面。
     
     
    5 什么时候适合使用包装类型?什么时候适合使用基本类型?
    •  在pojo类中定义的属性用包装类型
    • 有时候需要null 的时候使用包装类型
    • RPC 接口参数定义和返回值的时候用包装类型
    • 局部变量一般用基本类型
    • 反射方法调用的时候使用包装类型

    6 包装类型和基本数据类型的各种类型之间值的比较方式是什么?

    包装类型本质是对象,所以包装类型按对象处理 比较多的用equal 但是涉及精度问题解决的时候,采用相减取范围的方式解决,或者Double换 BigDecimal 采用complable接口实现等方式,涉及到精度要求比较高的时候,一定要注意。

    基本类型直接==比较就可以,比较的是具体数值。

    7 拆箱装箱

    基本类型转换为包装类型的过程称为装箱,反之成为拆箱。eg:Integer.valueOf()为装箱代码,Integer.intValue()为拆箱

    // 1)基本类型和包装类型
    int a = 100;
    Integer b = 100;
    System.out.println(a == b); true
    
    // 2)两个包装类型
    Integer c = 100;
    Integer d = 100;
    System.out.println(c == d); true
    
    // 3)
    Integer  c = 200;
    Integer  d = 200;
    System.out.println(c == d); false

    解释:

    第一个例子:用== ,b会自动拆箱,比较100==100 所以为true。

    第二个例子:-128 到 127 之间的数会从 IntegerCache 中取,所以没有生成新的对象,对象为同一个地址。所以为true

    第三个例子:超出范围,生成了新的对象。==比较的地址不同,为false。

    ps: 当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象。

     
  • 相关阅读:
    java8学习之Optional深入详解
    java8学习之Supplier与函数式接口总结
    java8学习之Predicate深入剖析与函数式编程本质
    conda
    matplotlib-折线图、散点图
    欧盟GDPR通用数据保护条例-原文
    python装饰器的应用案例
    python练习汇总
    python分段算利润、税收
    需求-shidebing
  • 原文地址:https://www.cnblogs.com/junbaba/p/13812371.html
Copyright © 2011-2022 走看看