i = i++;我这么写怎么了?没事,下一位。
我: 我命由我不由天。
面试官: 好的,下一位。
不扯哪些没用的,我们来说说今天有哪些题目让你怀疑人生。
题目一 永远长不大的i
public static void main(String[] args) {
int i = 0;
for (int j = 0; j < 100; j++) {
i = i++;
}
System.out.println(i);
}
小朱: (这家公司问这种问题太瞧不起我了吧。这个程序肯定打印100。毕竟,它对i做了100次增量操作。)100,循环了一百次做加法。
面试官: 结果不对,再给你个机会。
小朱: 不可能啊,那一定是99或100。
面试官: 都不对,回家等通知吧。
回到家小朱打开电脑,把代码写了一边,然后跑了一下,瞬间蒙了。
0
小朱: 我是不是该回炉重造。
解析
大家都知道i++是先赋值在++,但是用到的时候,就会忘记,还是用的少。其实每次都等于++前的值,所以一直被赋值为0,所以再多操作也是没用的。之前的文章就写过关于i++和++i的知识,各位是不是没有仔细去看。我每次都是觉得没问题,怎么会有bug,但是当翻看日志才发现自己是多么没用心。
题目二 idea有问题
public static void main(String[] args) {
//一天的毫秒数(肯定超过int的大小了,所以用long)
long millisecond = 24 * 60 * 60 * 1000;
//一天的纳秒数(肯定超过int的大小了,所以用long)
long nanosecond = 24 * 60 * 60 * 1000 * 1000;
//求纳秒和毫秒的转换
System.out.println(nanosecond/millisecond);
}
小朱: (上家公司是我一时大意,这次我要仔细看看,但是这个题有必要问吗?肯定1000啊,现在面试官是不是不会java,还是面试官是人事,算了。)1000,两个公式就相差1000,小学生都能看出来。
面试官: 哦,是吗,但是结果好像不是啊,你在想想。
小朱: (这在玩我吗?不是1000是多少?开溜吧。)额,对不起我肚子吃坏了好像,我想去个厕所。
回到家小朱打开电脑,又把代码写了一边,然后跑了一下,然后开始怀疑人生了。
5
小朱: 老师,我对不起你,我觉得我学的是假java。
解析
这个其实很简单,之前讲过int i = 2147483647; i + 1;
的结果是-2147483648
也就是说它越界了,你会说他不是用long
接收的吗?但是在计算的时候是int
,计算完成后才转成的long
,所以他越界了也就是说long nanosecond = 24 * 60 * 60 * 1000 * 1000;
这个的结果和你想想的不一样。其实结果是500654080
。所以得到最终结果是5
。
解决办法
public static void main(String[] args) {
//一天的毫秒数(肯定超过int的大小了,所以用long)
long millisecond = 24L * 60 * 60 * 1000;
//一天的纳秒数(肯定超过int的大小了,所以用long)
long nanosecond = 24L * 60 * 60 * 1000 * 1000;
//求纳秒和毫秒的转换
System.out.println(nanosecond/millisecond);
}
//结果
1000
这个就不用我解释了吧。这两道题说投机取巧,也不算,毕竟工作会用到,你反复看代码都找不到问题,这个坑一定要记住,否者永远找不大bug
所在。拿着这个题目去靠靠你的小伙伴,看看他们是不是全军覆没。