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

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才能保证线程安全;同时,也建议考虑使用原子类来应用在有线程安全需求的场景中;

  • 泛型的支持

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

你可能感兴趣的:(基本类型和包装类型有什么区别?)