Java面试题2020 整理

Java 基本数据类型

问:如下程序语句有什么问题?

short s1 = 1;
s1=s1+1; // 注释1
short s2 = 1;
s2+=1;  // 注释2

答:对于注释1来说,在s1+1运算时会自动提升表达式的的类型为int,所以将int赋予给short类型的变量s1时回出现类型转换错误,无法编译,除非主动加上强转。
对于注释2来说,+=是java语言规定的运算符,所以java编译器会对它进行转换特殊处理,所以可以正确编译执行。

问:java中char类型变量能不能存储一个中文的汉字?
答:java的char类型变量是用来储存Unicode编码字符的,Unicode字符集包含了汉字,所以char类型是可以存储包含在Unicode中的汉字的。

问:java的Integer和int有什么区别?
答:int 是 java 内置基本数据类型之一,java 为每个基本类型都提供了一个封装类,Integer 就是 int 的封装类(也叫包装类型);int 变量的默认值为 0,Integer 变量的默认值为 null,所以 Integer 可以区分出未赋值和值为 0 的区别;Integer 类内部提供了一些关于整数操作的方法,例如上文用到的表示整数的最大值和最小值。

问:java 的 switch 语句能否作用在 byte 类型变量上,能否作用在 long 类型变量上,能否作用在 String 类型变量上?
答 :由于 byte 的存储范围小于 int,可以向 int 类型进行隐式转换,所以 switch 可以作用在 byte 类型变量上;由于 long 的存储范围大于 int,不能向 int 进行隐式转换,只能强制转换,所以 switch 不可以作用在 long 类型变量上;对于 String 类型变量在 Java 1.7 版本之前不可以,1.7 版本之后是可以的。

问:能否在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量?
答:不行,我们不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

问:java 中 3*0.1 == 0.3 将会返回什么?true 还是 false?
答:false,因为浮点数不能完全精确的表示出来,一般都会损失精度。

问:java 中 float f = 3.4; 是否正确?
答:不正确,3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f = (float)3.4; 或者写成 float f = 3.4F; 才可以。

Java 包装类型装箱拆箱基础面试题

问:下面的运行输出是什么?

Long l1 =128L;
Long l2 =128L;
System.out.print(l1 == l2);//1 false
System.out.print(l1 ==128L);//2 true
Long l3 =127;
Long l4 =127L;
System.out.print(l3 ==l4);//3 true
System.out.print(l3 ==127L);//4 true

答:对于注释 1 的语句,Long 包装类型常量 cache 为 -128 到 127 之间,所以 l1 和 l2 变量是两个对象,== 比较的是对象的地址,所以打印为 false。
对于注释 2 的语句,由于包装类型在表达式中且表达式中至少有一个不是包装类型,所以 Long l1 == 128L 中 l1 自动拆箱退化为基本类型比较,所以数值比较为 true。
对于注释 3 的语句,Long 包装类型 -128 到 127 之间的值维护在一个常量池中,所以 l3 和 l4 引用同一个对象,故打印 true。
对于注释 4 的语句类似注释 2 语句,所以打印为 true。

问:java 1.5 的自动装箱拆箱机制是编译特性还是虚拟机运行时特性?分别是怎么实现的?
答:java 1.5 开始的自动装箱拆箱机制其实是编译时自动完成替换的,装箱阶段自动替换为了 valueOf 方法,拆箱阶段自动替换为了 xxxValue 方法。对于 Integer 类型的 valueOf 方法参数如果是 -128~127 之间的值会直接返回内部缓存池中已经存在对象的引用,参数是其他范围值则返回新建对象;而 Double 类型与 Integer 类型类似,一样会调用 Double 的 valueOf 方法,但是 Double 的区别在于不管传入的参数值是多少都会 new 一个对象来表达该数值(因为在指定范围内浮点型数据个数是不确定的,整型等个数是确定的,所以可以 Cache)。
注意:Integer、Short、Byte、Character、Long 的 valueOf 方法实现类似,而 Double 和 Float 比较特殊,每次返回新包装对象,对于两边都是包装类型的比较 == 比较的是引用,equals 比较的是值,对于两边有一边是表达式(包含算数运算)则 == 比较的是数值(自动触发拆箱过程),对于包装类型 equals 方法不会进行类型转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值