这几天的JAVA培训课上,不断的唤醒自己对JAVA的理解(时间太长,大学学的快忘干净了),其中有一些很有趣的面试题,都是在抠JAVA细节(唉,我是那种见坑就往下跳的人,一做就错),下面就来分享一下:
1)用JAVA程序写出当你在超市购物花费1.1元时,你给收银员2元钱,收银员找你0.9元的过程;
当时一看题目,好简单啊!迅速写出:
public class Sell{ public static void main(String[] args){ double total = 2.0; double used = 1.1; double result = total - used; System.out.println("result : " + result); } }
结果就悲剧了,因为JAVA中的浮点型运算只得到近似值,运行结果为:0.8999999999999999
为得到精确结果,需要调用JAVA在java.math包中提供的API类BigDecimal。(float和double只能用来做科学计算或者工程计算,在商业计算中要用java.math.BigDecimal)
正确结果为:
import java.math.BigDecimal; public class Sell1{ public static void main(String[] args){ BigDecimal bd1 = new BigDecimal("2.0"); BigDecimal bd2 = new BigDecimal("1.1"); System.out.println((double)bd1.subtract(bd2)); } }
运行结果:0.9
2)用强制类型转换(int)(char)(byte)-1,最后的结果为多少
当时看到这道题瞬间一愣,后来一想不还是-1吗,但不确定,就运行了一下,的到的结果为:65535((⊙o⊙)…更蒙了),后来才知道char字符型,存放字符常量,底层使用16位无符号整型表示,而且有符号数采用符号扩展,无符号数采用0扩展(计算机中,数都以补码的形式存放),所以计算的过程为:
100000000000000000000001
111111111111111111111111
1111,1111 byte
1111,1111,1111,1111 char
0000,0000,0000,0000,1111,1111,1111,1111 int
最后结果为:65536
3)int a = 1,b = 2,c = 3;
if(a > b && c++ > b)
int a = 1,b = 2,c = 3;
if(a > b & c++ > b)
两段程序中输出c值,各为多少?(哈哈,这道题我还知道第一个答案c = 3,第二个就蒙了)原来:
&&:逻辑运算符,具有逻辑短路功能(连接的两个条件,如果第一个条件为假,后面的条件不进行运算)
&:位运算符,但可以连接连个条件,但没有短路功能
结果为:第一个c = 3,第二个c = 4
4)String str1 = 'a' + 3 + "Hello";
String str2 = "Hello" + 'a' + 3;
str1,str2输出的结果为多少?(这回不敢大意了,一定有坑,但想了想,不会啊,还是跳坑吧)
其实“+对String类型是做字符串连接操作”,程序员几乎都知道,但“char字符型,存放字符常量,底层使用16位无符号整型表示”注意到的人就少了,这道题的结果为:
str1 = 100Hello
str2 = Helloa3
现在就这些,以后有的话再更新,JAVA要注重细节啊!