金蝶一面:Java 基本数据类型有哪些?包装类型的常量池技术了解么?

你好,我是 Guide。分享几道群友去金蝶面试遇到的 Java 基础面试真题:

  • “Java 中的几种基本数据类型了解么?”。
  • 基本类型和包装类型的区别?
  • 包装类型的常量池技术了解么?
  • 自动装箱与拆箱了解吗?原理是什么?

Java 中的几种基本数据类型了解么?

Java 中有 8 种基本数据类型,分别为:

  • 6 种数字类型:
    • 4 种整数型: byte 、 short 、 int 、 long
    • 2 种浮点型: float 、 double
  • 1 种字符类型: char
  • 1 种布尔型: boolean 。

这 8 种基本数据类型的默认值以及所占空间的大小如下:

对于 boolean ,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。

另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。

注意:

  1. Java 里使用 long 类型的数据一定要在数值后面加上 L ,否则将作为整型解析。
  2. char a = 'h' char :单引号, String a = "hello" :双引号。

这八种基本类型都有对应的包装类分别为: Byte 、 Short 、 Integer 、 Long 、 Float 、 Double 、 Character 、 Boolean 。

基本类型和包装类型的区别?

  • 包装类型不赋值就是 null ,而基本类型有默认值且不是 null 。
  • 包装类型可用于泛型,而基本类型不可以。
  • 基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道对象实例都存在于堆中。
  • 相比于对象类型, 基本数据类型占用的空间非常小。

:warning:注意 : 基本数据类型存放在栈中是一个常见的误区! 基本数据类型的成员变量如果没有被 static 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。

包装类型的常量池技术了解么?

Java 基本类型的包装类的大部分都实现了常量池技术。

Byte , Short , Integer , Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, Character 创建了数值在 [0,127] 范围的缓存数据, Boolean 直接返回 True or False 。

Integer 缓存源码:

Character 缓存源码:

Boolean 缓存源码:

如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

两种浮点数类型的包装类 Float , Double 并没有实现常量池技术。

下面我们来看一下问题。下面的代码的输出结果是 true 还是 false 呢?

Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。因此, i1 直接使用的是常量池中的对象。而 Integer i2 = new Integer(40) 会直接创建新的对象。

因此,答案是 false 。你答对了吗?

记住: 所有整型包装类对象之间值的比较,全部使用 equals 方法比较 。

自动装箱与拆箱了解吗?原理是什么?

什么是自动拆装箱?

  • 装箱 :将基本类型用它们对应的引用类型包装起来;
  • 拆箱 :将包装类型转换为基本数据类型;

举例:

上面这两行代码对应的字节码为:

从字节码中,我们发现装箱其实就是调用了 包装类的 valueOf() 方法,拆箱其实就是调用了 xxxValue() 方法。

因此,

  • Integer i = 10 等价于 Integer i = Integer.valueOf(10)
  • int n = i 等价于 int n = i.intValue() ;

注意: 如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值