背景
如题所述,笔者在前段时间面试某家金融科技公司时被问到了上述问题,脑海中的记忆一时也不是太清楚,特地前来进行整理并分享。
概述
int是基础的变量类型;Integer是包装类型;AtomicInteger是来自JUC的一个在并发编程场景下重要的包,对于Java开发人员来说,确实需要对其都有充分的认识与了解。
int
int 是 Java 的基本数据类型,它是一个 32 位的有符号整数,取值范围为 -2^31 到
2^31-1。
int 类型在性能上比 Integer 和 AtomicInteger 更优越,因为它是一个简单的原生类型,没有额外的封装和开销。
Integer
首先,Integer属于包装类。包装类型的出现就是我们可以在对象里面定义一些方法,因为封装的数据类型就是一个对象,可以拥有属性和方法,有了这些属性和方法我们就可以用它们来处理数据,比如Integer对象里的parseInt(String s),可以把字符串转换成int类型等。
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
Integer 是 Java 的一个包装类,它对应的基本类型是 int。**Integer 类型的所有实例都共享一个静态的缓存池,用于存储 int 类型的值。**当需要使用一个整数时,Java 会优先从缓存池中获取一个已有的 Integer 实例,而不会创建一个新的实例。这样可以提高性能,尤其是在处理大量整数时。
Integer 和 int的区别?
-
Integer是int的包装类,int则是java的一种基本的数据类型;
-
Integer变量必须实例化之后才能使用,而int变量不需要实例化;
-
Integer实际是对象的引用,当new一个Integer时,实际上生成一个指针指向对象,而int则直接存储数值
-
Integer的默认值是null,而int的默认值是0。
-
包装类Integer和基本数据类型比较的时候,java会自动拆箱为int,然后进行比较
缓存池
基本类型对应的缓冲池如下
Java 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;
- 前4 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据
- Character创建了数值在[0,127]范围的缓存数据
- Boolean 直接返回True 或 False。如果超出对应范围仍然会去创建新的对象。