美文网首页
基本类型和包装类型有什么区别?

基本类型和包装类型有什么区别?

作者: 文景大大 | 来源:发表于2021-02-21 09:29 被阅读0次

    int和Integer有什么区别?/基本类型和包装类型有什么区别?

    一、基础知识:

    • 基本数据类型总共有八个,分别是boolean、byte、short、char、int、float、double、long,它们是非对象的。

    • 包装数据类型是和基本数据类型一一对应的,比如int的包装类型是Integer,long的包装类型是Long。如果我们看包装类型的源码的话,会发现包装类型里面包含了基本数据类型,还提供了一些和数值相关的方法操作。同时,包装类型还提供了自动装箱和拆箱的功能,使得程序可以自动根据上下文,来转换包装类型和基本类型,使得程序员可以更加专注在业务逻辑上,简化了编程。

          public static void main(String[] args) {
              int a = 11;
              // 自动装箱
              Integer b = a + 10;
              log.info("{}", b);
      
              // 自动拆箱
              int c = b - 1;
              log.info("{}", c);
          }
      
      • 关于包装类型,有一个非常需要注意的地方,那就是值缓存的问题。

        意思就是各个包装类型,对于一定范围内的数据,在创建新的对象的时候,是使用缓存中的对象,而不是单独新建一个对象。如果程序员不知道这个知识点,可能会导致误用从而引发程序问题。这是一个很重要的知识点,详情可以参考Short/Integer/Long以及Character包装类的缓存问题

    二、进阶知识:

    • 自动装箱和自动拆箱的原理

      这其实是Java为我们提供的语法糖,我们可以简便地书写如上的代码,不用考虑转换的问题,Java会自动为我们做好类型的转换,使得不同的写法在编译之后得到的字节码都是一致的,所以自动装箱和自动拆箱是发生在编译阶段的。

      我们也可以自己处理类型转换,但如下代码会显得有些繁琐。

          public static void main(String[] args) {
              int a = 11;
              // 手动装箱
              Integer b = Integer.valueOf(a + 10);
              log.info("{}", b);
      
              // 手动拆箱
              int c = b.intValue() -1;
              log.info("{}", c);
          }
      
    • 基本类型和包装类型的使用场景区别

      基本类型不是对象,占用的内存空间比较小,适合在对性能敏感的逻辑中、开发的公共类库中、方法内部临时变量使用的场景;

      包装类型会创建对象,比较适合在普通的业务逻辑中使用,能给数值操作带来便利性,提供了很多方法,而且和面向对象契合;

    • 包装类型的数据是final不可变的

      这点和String其实是一样的,如果对包装类型进行运算操作,那么其结果其实是一个新的对象了;

    • 线程安全问题

      不管是基本类型还是包装类型,本身不能保证线程安全,都需要使用线程安全的手段比如synchronized才能保证线程安全;同时,也建议考虑使用原子类来应用在有线程安全需求的场景中;

    • 泛型的支持

      基本数据类型是不支持使用泛型的,仅包装类型可以;

    相关文章

      网友评论

          本文标题:基本类型和包装类型有什么区别?

          本文链接:https://www.haomeiwen.com/subject/ujstfltx.html