博客概要
承接之前篇博文中提到的数据类型,在此分享“int”和“Integer”的知识点~
int 和 Integer的区别
int | Integer |
---|---|
基本数据类型 原始类型 | int的包装类 引用类型 |
变量不需要实例化使用 | 变量必须实例化后才能使用 |
直接存储数据值 | 是对象的引用 指向new出Integer对象 |
默认值:0 | 默认值:null |
… | … |
1.默认值问题
int | Integer |
---|---|
默认值:0 | 默认值:null |
由上表可知,int默认值为0,Integer的默认值为null,粗看其实觉得没什么,“0”和“null”的区别能有什么意义呢?但其实在实际的使用中,默认值是挺重要的,在此举个栗子:
以一次面试为例:
面试有两个人A和B,面试官准备了两套笔试题
A没来面试,所以他没有做题
B做了笔试题,但…全错 = =
由上面这个例子可知,A没来参加笔试,那他应该是没有成绩,应该为null;而B是做了全错,成绩应该才是0。“null”和“0”的区别就在这里了,所以想要清楚表达“没来参加”以及“成绩为0”的话,就得要使用Integer,int是无法区分“未赋值”和“值为0”情况的。
2.实例化问题
int | Integer |
---|---|
变量不需要实例化使用 | 变量必须实例化后才能使用 |
int wcw = 7; System.out.print( wcw ); | Integer wcw = new Integer( 7 ); System.out.print( wcw ); |
由上表可知,int可直接定义变量名并赋值使用,Integer则需要实例化,也就是“new”一个对象出来才能赋值使用。
看似Integer使用起来好像比较麻烦一些,但它在实例化之后,可以凭“变量名.方法名( )”也就是“wcw.ParseInt( )”(这是Integer中将基本数据类型转换为字符串的一个方法)这种形式来使用Integer里封装的方法,提供了一系列数据的成员和操作,功能性更多元化。
这里其实还可以涉及到Java拆装箱的知识,那啥是“拆装箱”?下面做简单介绍。
其实我们不妨就把这个过程想象成,“把东西装进箱子”、“把东西从箱子里拆出来”这两个过程,到底是啥意思呢?下面结合代码举栗子:
//1.
Integer wcw = new Integer( 7 );
//2.
int luffy = wcw.inValue( );
上面栗子中,数字“7”就相当于要拆装的实体对象,第一行代码就是使用Integer这个包装类,将“7”装进“箱子”——“wcw”这个对象,这就是“装”;而第二行代码,是使Integer中包装类型的数据转化为int的基本数据类型,也就是将“7”从Integer中取出来,这就是“拆”。不过这还只是“手动拆装箱”的过程,在JDK1.5及之后,新增了“自动拆装箱”,下面结合代码举栗子:
//1.
Integer wcw = 7;
//2.
int luffy = wcw;
以上就是“自动拆装箱”,可以很明显的发现,“自动”比起“手动”少了些代码,定义赋值方式变得更简单了,但是其实往深了,里面会有一些取值范围等细节需要我们注意的地方,博主自己也还有待继续了解的= =
3.数据值问题
int | Integer |
---|---|
直接存储数据值 | 是对象的引用 指向new出Integer对象 |
值传递 传值传参传的是副本 修改后原值不变 | 引用传递 传值传参穿的是地址 修改后原值改变 |
保存在栈 | 保存在堆 |
… | … |
以上表中,有两个艰难理解的概念,“值传递”和“引用传递”,举个栗子解释一下:
有俩同学A和B,要考试了,A有一份复习资料,关于复习资料的使用:
"值传递"就相当于,B把A的复习资料复印了一份,B在自己这份资料上涂改,并不会影响到A的资料。
“引用传递"就相当于,A和B共用同一份复习资料,资料存放的地方是一个"地址”,B要使用资料时,就得按照"地址"去找,并且在资料上涂改的时候,也会影响到A的使用。
在以上的栗子中,“引用”的概念可能也比较难理解吧,下面再举一个栗子解释:
其实相当于“找学生”
将“学生”理解为要找的对象实体,“地址”理解为学生学号
每次找学生都是通过学号找,这就是“引用”
经由以上栗子的解释后,其实就不难理解,int在进行值传递的时候,是将实参的值,copy一份给形参,而Integer在进行引用传递的时候,是将实参的地址值,copy一份给形参,一个是“传值”,一个是“传地址”。所以,我们在进行比较的时候,对于判断地址是否相等的,要使用“==”;而对于判断内容实体值是否相等的,要使用“equals”。
总结
说实话平时敲代码,不可能用不到“int”来定义变量,但是用了无数次,今天总结了也才明白,小小的“int”也还有诸多细节需要注意的,所以博主的基础真还有点糟糕= =继续巩固学习吧,加油~
参考资料
【1】Java传参-基本数据类型和引用数据类型作为参数的区别(值传递)
【2】java面试题之int和Integer的区别
【3】彻底让你明白 Integer 类和 int 基本数据类型的区别
【4】int和Integer的区别,什么是自动装箱和自动拆箱?
【5】…