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才能保证线程安全;同时,也建议考虑使用原子类来应用在有线程安全需求的场景中;
-
泛型的支持
基本数据类型是不支持使用泛型的,仅包装类型可以;
网友评论