java基本类型类及其包装类介绍

java内置了8种基本数类型及其包装类对应关系如下表

在这里插入图片描述

 基本数据类型与其包装类在JDK5之后引入了自动装箱的概念,即基本数据类型与其包装类之间可以自动转换

在绝大多数情况下,基本数据类型和包装类类型可以混用:

如下表中的两种foreach的遍历方法都是可行的,

int[] arr = new int[10];

for(Integer num : arr){
    
}

for(int num : arr){
}

 但是也有必须使用包装类的情况

1.在集合的声明时必须使用包装类进行声明,因为集合只可以存储引用类型

HashSet<Integer> set = new HashSet<>();

2.在调用Arrays.sort进行自定义排序时,必须传入基本数据类型的包装类数组,因为底层泛型不可以使用基本数据类型(这部分是我自己猜测,具体还未知),如下表代码运行报错,需要将其转化为Integer数组(只可以一一转化,jdk8目前还不可以自动转化)

int[] arr = new int[10];

Arrays.sort(arr,new Comparator<Integer>(){
    public int compare(Integer o1,Integer o2){
        
   }
});

3.调用equals方法进行比较时,必须使用包装类 

除以上情况,基本数据类型和包装类基本可以互相转化
 

一下罗列基本数据类型和包装类之间进行运算的情况,

1.int 和 Integer进行 == 运算

在这种情况下,观察字节码,其实就调用方法将Integer进行自动拆箱,然后再进行比较,故在这种情况下只要值相等就可以

  Integer i = 222;
  int j = 222;
  System.out.println(i);

2.Integer和Integer之间用==运算

2.1这种情况下,要进行情况区分,因为==在引用对象之间是比较地址,如果两个都是new的那么一定地址不同,因为new的话指的是堆中的不同数据

   Integer i = new Integer(222);
   Integer j = new Integer(222);
   System.out.println(i == j);

2.2 如果一个是new,一个是直接赋值的话,那么也肯定是不相等的,因为指向地址不同

 Integer i = new Integer(222);
 Integer j = 222;
 System.out.println(i == j);

2.3两个都是直接赋值的话,因直接给Integer类型赋值基本数据的底层操作使用的是valueOf(),并且Integer默认先创建并缓存-128~127之间数的Integer对象,当调用valueOf时,如果参数在-128~127之间则计算下标并从缓存中返回,否则创建一个新的Integer对象,则在-128-127之间,两者是相等的,否则是不相等的

 Integer i = 122;
 Integer j = 122;
 System.out.println(i == j);

3.int直接和其他引用类型==,直接报错,证明int是不可以和除对应包装类之外的数据类型比较的,原因如下:

== 等于比较运算符,如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.(在这里我们可以理解成==比较的是两个变量的内存地址)
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值