Java面试-基础篇之2
2.int类型与Integer类型的区别
区别:
-
Integer是Java种int的包装类,int是Java的基础数据类型之一。Java共有8种基本数据类型,可分为整型:int、byte、short、long,浮点型:float、double,字符型:char,最后一个是boolean。他们都有对应的包装类型。
-
Integer默认值是null,int默认值是0
-
因为Interger是一个类,声明的Integer的变量需要实例化;而int声明不需要实例化
-
Integer对象存放在堆内存中,其引用存放在栈内存中;int数据为全局变量时,存放在栈内存中。
栈内存存取速度比堆内存快,仅次于直接位于cpu的寄存器。数据大小和生命周期确定,栈中的数据可以共享。
堆内存,堆可以动态分配内存大小,生存周期也不必告诉编译器(Java垃圾回收机制)。堆运行时分配内存,存取速度慢。
综上可以简单的理解为为了高效,可以把一些数值小的,简单的变量用int声明,存放在栈中。那么明明时栈中的存取速度更快,为什么有时候还要使用Integer呢?
因为在对象中可以定义更多的功能办法操作该数据,例如基本数据类型和字符串直接的转换。有特殊类只接收对象的情况,例如集合类(ArrayList、LinkedList、HashSet、TreeSet、HashMap、LinkedHashMap、等)中只存入对象不能存入基本数据类型,泛型不支持基本数据类型
为什么在项目中使用Integer?
- 因为Integer可以区分未赋值和值为0的区别,int则无法表达出赋值的情况。在开发中,Integer默认为null,所以EL表达式在文本框中显示时,值为空白字符,而int默认为0,用EL表达式显示时,结果为0,对于int类型数据是否是经过计算还是默认值,无法判断,所以int不适合作为web表单数据的类型。
- Hibernate中,OID定义为Integer时,在Hibernate可以根据其值判断对象是否是临时的,如果将OID定义为int类型,还需要在映射文件中设置unsaved——value属性为0
- Integer提供了多个与整数相关的操作方法。因为它继承自Object类,还定义了整数最大值和最小值的常量。
Integer.class源码如下
/**
* A constant holding the minimum value an {@code int} can
* have, -2<sup>31</sup>.
*/
@Native public static final int MIN_VALUE = 0x80000000;
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
基本数据类型的包装类大部分在一定的数值区间内有缓存。如Integer、Short、Long和Byte类创建了数值为[-128,127]之间的缓存,Character创建了[0,127]的缓存,Boolean直接返回true或false。而Double和Float类型并没有实现缓存机制。、
如,Integer i1 = 30;这一步相当于Integer i1 = Integer.valueOf(30),而Integer i2 = new Integer(40)则是会直接创建对象。
名词解释:EL表达式。
EL 表达式全称是Expression Language,是servlet规范中的一部分,是JSP2.0中加入的内容。目前JSP已经很少使用了,了解就好。
注:这个问题是今年面试被问的一道题,面试时完全不知道面试官想要问什么,所以回答的也是很失败,所以还是需要好好看书,夯实一下基础。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix