java基本类型与包装类型之间的关系

1 基本常识

在Java中,八种基本数据类型分别为byte、short、int、long、float、double、boolean、char。

八种基本数据类型的包装类除了char的是Character,int类型的是Integer,其他都是首字母大写。

2 包装类方法简介

2.1 基本类型转化为包装类型:valueOf()

valueOf() 方法用于将基本数据类型或字符串转换为对应的包装类对象。这对于在面向对象的环境中处理基本数据类型非常实用。

Integer i = Integer.valueOf(10); // 将基本数据类型转换为包装类对象
Integer a = Integer.valueOf("100"); // 将字符串转换为包装类对象

2.1 字符串转化为基本类型:parseXXX(String str)

parseXXX(String str) 方法用于将字符串转换为对应的基本数据类型,其中 XXX 表示基本数据类型的名称。

int a = Integer.parseInt("100"); // 将字符串转换为int类型

2.3 包装类型转化为基本类型:XXXValue()

数字类的包装类提供了 XXXValue() 方法,用于将当前包装类对象转换为对应的基本数据类型。

Integer a = Integer.valueOf(100);
int b = a.intValue(); // 将包装类对象转换为int类型 

2.4 自动拆箱与装箱

自动拆箱和装箱是Java语言1.5版本之后引入的特性,通过编译器自动将基本数据类型和包装类相互转换,简化了代码书写。

Integer i = 123; // 自动装箱,相当于 Integer i = Integer.valueOf(123);
int i1 = i + 1; // 自动拆箱,相当于 int i1 = i.intValue() + 1;

3 对int和Integer的深入探究

3.1 int和Integer值的比较

Integer在比较值是否相等时不同于int可以直接使用 == 进行比较,引用数据类型使用 == 比较的是地址而不是值

int a = 128;
int b = 128;
        
Integer a1 = 128;
Integer b1 = 128;

System.out.println(a==b);       // 输出true
System.out.println(a1==b1);     // 输出false

与String一样,比较Integer值是否相同应使用.equals()方法

Integer a = 128;
Integer b = 128;
System.out.println(a.equals(b));     // 输出true

3.2 Integer.valueOf()源码分析

刚刚说过两个Integer对象使用==比较时会比较两个对象的地址,导致为false

但是有时会发现这种情况,使用==比较也得出了true

Integer a1 = 100;
Integer b1 = 100;
System.out.println(a1==b1);     // 输出true

为了弄清楚上述代码中a1==b1为true的原因,需要查看Integer.valueOf()方法的代码

源码如下:

在这里插入图片描述

在对int进行自动装箱时,会调用此方法,当i的值在low和high之间时会返回cache数组中的元素;

当i超出low和high的范围时才会new一个Integer对象返回

继续查看cache

在这里插入图片描述

不难发现: low=-128, high=127, 而cache是一个存放了-128至127共256个整数对应的Integer对象;

所以对-128至127之间的整数进行装箱时,当数值相同时,返回的Integer对象是相同的;

但超出此范围的整数即使数值相同,也会得到两个不同的对象,这就是导致两次使用==比较Integer结果不一致的原因;

4 小结

  • 基本类型直接在栈中存储数值,而包装类则存储的是堆中的引用。所以包装类型需要占用更多的内存空间
  • 泛型不能使用基本类型
  • 实体类中字段建议使用包装类, 因为数据库的查询结果可能是null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把Integer 对象转换成int值),就会抛出 NullPointerException 的异常
  • 集合类(ArrayList,HashMap等)里面保存的必须是 Object 类型的对象,无法保存基本类型。
  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值