没有合适的资源?快使用搜索试试~ 我知道了~
Java 数据类型常见面试题总结 · .pdf
需积分: 11 0 下载量 10 浏览量
2023-02-22
18:56:08
上传
评论
收藏 511KB PDF 举报
温馨提示
试读
1页
Java 数据类型常见面试题总结 · .pdf
资源推荐
资源详情
资源评论
Java 数据类型常⻅⾯试题总结
53 ⼈点赞
陈⻰
jjian
魔笛
刘帅
! SnailClimb
" 05-06 19:29
# 12508
$ 11
举报
上⼀篇
Java IO 模型常⻅⾯试题总结
下⼀篇
泛型&通配符常⻅⾯试题总结
所有评论(11)
Odysseus
04-03 11:33
引⽤原⽂:我们从上图可以看到,有⼀条是这样说的:“数据库的查询结果可能是 null,…
liming
05-04 19:12
引⽤原⽂:两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
liming
05-04 19:25
引⽤原⽂:记住:所有整型包装类对象之间值的⽐较,全部使⽤ equals ⽅法⽐较。
huangkl
05-04 21:59
liming
05-05 16:57
SnailClimb
liming
05-06 19:29
shea
05-05 23:16
引⽤原⽂:拆箱
安安安安吉
06-20 15:40
引⽤原⽂:基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,⽽包装类型属…
SnailClimb
SnailClimb
06-20 17:07
超越每⼀天
06-27 15:44
引⽤原⽂:[图⽚]
SnailClimb
06-28 17:17
注册 或 登录 语雀进⾏评论
加⼊语雀,参与知识分享与交流
或 语雀进⾏评论
注册
登录
⽴即加⼊
%
1
4
shea
1
关于语雀 使⽤帮助 数据安全 服务协议 English 快速注册
这篇⽂章绝对⼲货!⽂章涉及到的概念经常会被⾯试官拿来考察求职者的 Java 基础。
本篇采⽤⼤家⽐较喜欢的⾯试官问答的形式来展开。
!
⾯试官 : Java 中有哪 8 种基本数据类型?
🙋
我 :Java 中有 8 种基本数据类型,分别为:
1. 6 种数字类型 : byte 、 short 、 int 、 long 、 float 、 double
2. 1 种字符类型: char
3. 1 种布尔型: boolean 。
!
⾯试官 : 它们的默认值和占⽤的空间⼤⼩知道不?
🙋
我 :这 8 种基本数据类型的默认值以及所占空间的⼤⼩如下:
另外,对于 boolean ,官⽅⽂档未明确定义,它依赖于 JVM ⼚商的具体实现。逻辑上理解
是占⽤ 1 位,但是实际中会考虑计算机⾼效存储因素。
注意:
1. Java ⾥使⽤ long 类型的数据⼀定要在数值后⾯加上 L,否则将作为整型解析:
2. char a = 'h' char :单引号, String a = "hello" :双引号
!
⾯试官 : 说说这 8 种基本数据类型对应的包装类型。
🙋
我 :这⼋种基本类型都有对应的包装类分别为: Byte 、 Short 、 Integer 、 Long
、 Float 、 Double 、 Character 、 Boolean
!
⾯试官 :那基本类型和包装类型有啥区别不?
🙋
我 :包装类型不赋值就是 Null ,⽽基本类型有默认值且不是 Null 。
另外,这个问题建议还可以先从 JVM 层⾯来分析。
基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,⽽包装类型属于对象类型,我们知
道对象实例都存在于堆中。相⽐于对象类型, 基本数据类型占⽤的空间⾮常⼩。
!
⾯试官 : 包装类型的常量池技术了解么?
🙋
我 : Java 基本类型的包装类的⼤部分都实现了常量池技术。
Byte , Short , Integer , Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型
的缓存数据, Character 创建了数值在[0,127]范围的缓存数据, Boolean 直接返回 Tr
ue Or False 。
Integer 缓存源码:
Character 缓存源码:
Boolean 缓存源码:
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的⼤⼩只是在性能和资源之间的权
衡。
两种浮点数类型的包装类 Float , Double 并没有实现常量池技术。
下⾯我们来看⼀下问题。下⾯的代码的输出结果是 true 还是 flase 呢?
Integer i1=40 这⼀⾏代码会发⽣装箱,也就是说这⾏代码等价于 Integer i1=Integ
er.valueOf(40) 。因此, i1 直接使⽤的是常量池中的对象。⽽ Integer i1 = new
Integer(40) 会直接创建新的对象。
因此,答案是 false 。你答对了吗?
记住:所有整型包装类对象之间值的⽐较,全部使⽤ equals ⽅法⽐较。
!
⾯试官 : 为什么要有包装类型?
🙋
我 :
Java 本身就是⼀⻔ OOP(⾯向对象编程)语⾔,对象可以说是 Java 的灵魂。
除了定义⼀些常量和局部变量之外,我们在其他地⽅⽐如⽅法参数、对象属性中很少会使⽤基
本类型来定义变量。
为什么呢?
我举个例⼦,假如你有⼀个对象中的属性使⽤了 基本类型,那这个属性就必然存在默认值了。
这个逻辑不正确的!因为很多业务场景下,对象的某些属性没有赋值,我就希望它的值为 null。
你给我默认赋个值,不是帮倒忙么?
另外,像泛型参数不能是基本类型。因为基本类型不是 Object ⼦类,应该⽤基本类型对应
的包装类型代替。我们直接拿 JDK 中线程的代码举例。
Java 中的集合在定义类型的时候不能使⽤基本类型的。⽐如:
!
⾯试官 : 什么是⾃动拆装箱?原理了解么?
🙋
我 :
基本类型和包装类型之间的互转。举例:
上⾯这两⾏代码对应的字节码为:
从字节码中,我们发现装箱其实就是调⽤了 包装类的 valueOf() ⽅法,拆箱其实就是调⽤
了 xxxValue() ⽅法。
因此,
Integer i = 10 等价于 Integer i = Integer.valueOf(10)
int n = i 等价于 int n = i.intValue() ;
!
⾯试官 : ⾃动拆箱可能会引发 NPE 问题,遇到过类似的场景么?
🙋
我 :
在《阿⾥巴巴开发⼿册》上就有这样⼀条规定。
我们从上图可以看到,有⼀条是这样说的:“数据库的查询结果可能是 null,因为⾃动拆箱,⽤
基本数据类型接收有 NPE ⻛险”。
我们来模拟⼀个实际的案例:
运⾏代码之后,果然出现了 NPE 的问题。
为什么会这样呢? 我们对 AutoBoxTest.class 进⾏反编译查看其字节码(我更推荐使⽤
IDEA 插件 jclasslib 来查看类的字节码)。
反编译后得到的 should_Throw_NullPointerException() ⽅法的字节码如下:
我们可以发现⾃动拆箱 Long -> long 的过程,不过是调⽤了 longValue() ⽅法罢
了!
也就是说下⾯两⾏的代码实际是等价的:
因为, getNum() 返回的值为 null ,⼀个 null 值调⽤⽅法,当然会有 NPE 的问题
了。
通过上⾯的分析之后,我来考了⼀个不论是平时开发还是⾯试中都经常会碰到的⼀个问题:“三
⽬运算符使⽤不当会导致诡异的 NPE 异常”。
请你回答下⾯的代码会有 NPE 问题出现吗?如果有 NPE 问题出现的话,原因是什么呢?你会
怎么分析呢?
答案是会有 NPE 问题出现的。
我们还是通过查看其字节码来搞懂背后的原理(这⾥借助了 IDEA 插件 jclasslib 来查看类字节
码)。
从字节码中可以看出,22 ⾏的位置发⽣了 拆箱操作 。
详细解释下就是: flag ? 0 : i 这⾏代码中,0 是基本数据类型 int,返回数据的时候 i 会
被强制拆箱成 int 类型,由于 i 的值是 null,因此就抛出了 NPE 异常。
如果,我们把代码中 flag 变量的值修改为 true 的话,就不会存在 NPE 问题了,因为会直接
返回 0,不会进⾏拆箱操作。
我们在实际项⽬中应该避免这样的写法,正确
✅
修改之后的代码如下:
这个问题也在 《阿⾥巴巴开发⼿册》中 被提到过。
基本数据类型
包装类型
《深⼊理解 Java 虚拟机》 :局部变量表主要存放了编译期可知的基本数据类型
(boolean、
byte、char、short、int、float、long、double)
、
对象引⽤
(reference 类型,它不同于对
象本身,可能是⼀个指向对象起始地址的引⽤指针,也可能是指向⼀个代表对象的句柄或其他
与此对象相关的位置)。
包装类型的常量池技术
为什么要有包装类型?
⾃动拆装箱
什么是⾃动拆装箱?原理?
●
●
⾃动拆箱引发的 NPE 问题
案例 1
案例 2
基本类型 位数 字节 默认值
int 32 4 0
short 16 2 0
long 64 8 0L
byte 8 1 0
char 16 2 'u0000'
float 32 4 0f
double 64 8 0d
boolean 1 false
这种情况下不⽤装箱拆箱最好
⾸先,是可以实现的,但不会实现。
实数具有稠密性: R实数集具有稠密性,即两个不相等的实数之间必有另⼀个实数。所以
我们可以理解为,实数具有⽆数多个。反映在程序中也是这样吗?不是的。浮点数是有
精度的,也就是我们并不能⽤它列举所有实数,所以Float/Double都是有限的。具体是
多少个,取决于它的位数。
既然是有限个,我们就可以把这某⼀区间有限个缓存起来。但不会这么做,⾸先在某个
区间的浮点数还是⾮常多,另外,我们没法判断哪个区间是最容易命中的。
如果能确定哪些数是⼤概率命中的,就可以做。就像字符串虽然是⽆限个,但我们还是
可以有常量池。空间换取时间,值得就可以做。
所有整型包装类对象之间值的⽐较,全部使⽤ equals ⽅法⽐较。
说明:对于 Integer var =?在-128 ⾄ 127 之间的赋值,Integer 对象是在
IntegerCache.cache产⽣,会复⽤已有对象,这个区间内的 Integer 值可以直接使⽤==
进⾏判断,但是这个区间之外的所有数据,都会在堆上产⽣,并不会复⽤已有对象,这
是⼀个⼤坑,推荐使⽤ equals ⽅法进⾏判断。
包装类型的常量池技术章节中,Integer i1 = 40, 这段代码应该是装箱⽽不是原⽂说的
拆箱
我理解的也是
已修正,这⾥笔误了。
装箱
局部变量表不是⽅法的吗? 如果是对象的属性是基本数据类型不应该是和对象⼀起放在
堆上吗?
基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型
的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象
类型,我们知道⼏乎所有对象实例都存在于堆中。
为什么说是⼏乎所有对象实例呢? 这是因为 HotSpot 虚拟机引⼊了 JIT 优化之
后,会对对象进⾏逃逸分析,如果发现某⼀个对象并没有逃逸到⽅法外部,那么
就可能通过标量替换来实现栈上分配,⽽避免堆上分配内存。
⚠
注意 : 基本数据类型存放在栈中是⼀个常⻅的误区! 基本数据类型的成员变
量如果没有被 static 修饰的话(不建议这么使⽤,应该要使⽤基本数据类型对应
的包装类型),就存放在堆中。
⼩⽩的⼀点疑问:图中a和b都是Integer类型,为啥做*运算后会变成int类型哇???
包装类型进⾏算数运算的时候是会进⾏拆箱的。
⼤纲
基本数据类型
!
包装类型
包装类型的常量池技术
为什么要有包装类型?
!
⾃动拆装箱
什么是⾃动拆装箱?原理?
!
⾃动拆箱引发的 NPE 问题
案例 1
案例 2
53
11
Java 数据类型常⻅⾯试题总结
登录 / 注册
《Java⾯试指北》
⽬录
技术⾯试题篇
系统设计
Java
Java IO 模型常⻅…
Java 数据类型常…
泛型&通配符常⻅…
String 类常⻅⾯试…
数据库
常⻅框架
分布式
⾼并发
服务器
Devops
技术⾯试题⾃测篇
⾯经篇
练级攻略篇
如何成为⼀个合格的…
资源评论
没掉发的程序员
- 粉丝: 1844
- 资源: 320
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功