回答重点
基本类型:
- Java中有8种基本数据类型(byte、short、int、long、float、double、char、boolean)
- 他们是直接存储数值的变量,位于栈上(局部变量在栈上、成员变量在堆上,静态字段/类在方法区),性能较高
- 且不支持null值
包装类型:
- 每个基本类型都有一个对应的包装类型(Byte、Short、Integer、Long、Float、Double、Character、Boolean)
- 包装类型是类,存储在堆中,可以用于面向对象编程
- 支持null值
区别:
1)性能区别:
- 基本类型:占用内存小,效率高,适合频繁使用的简单操作
- 包装类型:本质是对象,涉及内存分配和垃圾回收,性能相对较低
2)比较方式不同:
- 基本类型:比较用==,直接比较数值
- 包装类型:比较对象的内容用equals(),比较对象的内存地址用==
3)默认值不同:
- 基本类型:默认值是0,false等
- 包装类型:默认值为null
4)初始化的方式不同:
- 基本类型:直接赋值
- 包装类型:用new
5)存储方式不同:
- 基本类型:如果是局部变量则保存在栈上,如果是成员变量保存在堆中
- 包装类型:保存在堆上(成员变量,在不考虑JIT优化的栈上分配时,都是随着对象一起保存在堆上的)
扩展知识
自动装箱和拆箱
因为Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如集合类就不能存基本类型
为了让基本类型也具有对象的特征,就出现了包装类型。它相当于将基本类型包装起来,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作
- 装箱:基本类型自动转换为包装类型对象
- 拆箱:包装类型对象自动转换为基本数据的值
【Java基础面试题011】什么是Java中的自动装箱和拆箱?-CSDN博客
缓存机制
包装类型中的Byte、Short、Integer和Long对某些范围内的值(例如Integer缓存-128到127)会使用对象缓存来提升性能。因此,统一数值的包装类型对象可能是同一个实例
java">Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false
缓存机制可以看我另一篇博客:【Java基础面试题024】什么是Java的Integer缓存池?-CSDN博客