Java - 基本数据类型和封装类型

基本类型有默认值,而包装类型初始为null。然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型。

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

1、整数:包括int、short、byte、long初始值为0。

2、浮点型:float、double初始值为0.0

3、字符:char初始值为空格,即'' ",如果输出,在Console上是看不到效果的。

4、布尔:boolean初始值为false

|---------|--------|-----------|-----------------|
| 基本型别 | 大小 | 最小值 | 最大值 |
| boolean | ----- | ----- | ------ |
| char | 16-bit | Unicode 0 | Unicode 2^16-1 |
| byte | 8-bit | -128 | +127 |
| short | 16-bit | -2^15 | +2^15-1 |
| int | 32-bit | -2^31 | +2^31-1 |
| long | 64-bit | -2^63 | +2^63-1 |
| float | 32-bit | IEEE754 | IEEE754 |
| double | 64-bit | IEEE754 | IEEE754 |
| void | | | |

注意:

表格里的^代表的是次方

Java采用unicode,2个字节来表示一个字符,1个字节等于16位。

基本类型的包装类

Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail

其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,

BigDecimal支持任意精度带小数点的运算

基本类型:int 、double、float、long、byte、boolean、char

封装类型: integer 、Double、Float、Long、Byte、Boolean、Char

基本类型的特点

1、基本数据类型在进行参数传递时,使用的是值传递

2、基本类型的创建是在堆栈上创建的(有泄漏问题)

3、创建不是通过new进行的

封装类型的特点

1、通过new进行创建,也可以直接进行赋值

2、进行参数传递的时候是使用的"引用传递"既地址传递的方式

3、创建是在堆上创建的

4、数据类型包装类的值是不可变的

封装类型的优势:

创建封装类型是可以使用一些基本类型不具备的方法,比如valueOf(),toString()等等。还有你如果想传递一个int对象的引用,而不是值,那只能用封装类

基本类型与包装类型的异同

1、在Java中,一切皆对象,但八大基本类型却不是对象。

2、声明方式的不同,基本类型无需通过new关键字来创建,而封装类型则需new关键字。

3、存储方式及位置的不同,基本类型是直接存储变量的值,保存在堆栈中能高效的存取;封装类型需要通过引用指向实例,具体的实例保存在堆中;

4、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false;

5、使用方式的不同,比如与集合类合作使用时只能使用包装类型。

6、什么时候该用包装类,什么时候该用基本类型,看基本的业务来定:这个字段允不允许null值,如果允许,则必然要用封装类;否则,基本类型就可以了。如果用到比如泛型和反射调用函数,就需要用包装类!

源码

看看 Boolean 的属性和构造方法,了解一下它如何包装 boolean

java 复制代码
// final boolean类型的属性,通过构造方法注入值
private final boolean value;
​
// 构造方法 Boolean a = true 实际上就是调用这个方法
public Boolean(boolean value) {
    this.value = value;
}
​
// 构造方法
public Boolean(String s) {
    this(parseBoolean(s));
}

简单来说就是,boolean 定义的属性一定要有值,如果 Boolean 对象值为 null,解包过程中就会出现NPE

基本数据类型和包装类型使用标准

注:

包装类的赋值方法是valueof但是从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。

看一下valueof的源码了解缓存机制

java 复制代码
public static Integer valueOf(int i) {
     assert IntegerCache.high>= 127;
     if (i >= IntegerCache.low&& i <= IntegerCache.high)
     return IntegerCache.cache[i+ (-IntegerCache.low)];
     return new Integer(i); 
}

各个包装类缓存值范围 :

boolean:true和false

byte:-128~127

char:0~127

short:-128~127

int:-128~127

long:-128~127

float和double没有缓存

在缓存范围内的值相当于已经开辟好了一块空间,或者是已经new好了对象

Java--Integer的常量缓存池(默认-128~127数值范围)_integer缓存数据的范围-CSDN博客

相关推荐
XuanXu几秒前
Java Project Leyden如何提高JVM启动速度&技术前瞻
java
人猿泰飞3 分钟前
在Ubuntu-22.04.5中安装ONLYOFFICE DocSpace(协作空间)【注意:安装失败,谨慎参考!】
java·linux·运维·python·ubuntu·项目管理·onlyoffice
gospace6 分钟前
Golang Event Bus 最佳实践:使用 NSQite 实现松耦合架构
开发语言·架构·golang·事件·总线·event·event bus
愿你天黑有灯下雨有伞9 分钟前
MyBatis与MyBatis-Plus:字段自动填充的两种实现方式
java·mybatis
风中飘爻12 分钟前
JavaScript:表单及正则表达式验证
开发语言·javascript·ecmascript
程序员黄老师14 分钟前
MyBatis 中 Mapper 传递参数的多种方法
java·tomcat·mybatis
鸽鸽程序猿24 分钟前
【JavaEE】SpringBoot 统一功能处理
java·spring boot·java-ee
极客先躯31 分钟前
高级java每日一道面试题-2025年4月07日-微服务篇[Nacos篇]-如何监控Nacos的运行状态?
java·开发语言·微服务
尘寰ya31 分钟前
前端面试-垃圾回收机制
java·前端·面试
遇见你真好。34 分钟前
递归获取部门数方法
java·springboot