一些JAVA中有趣的面试题

  这几天的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要注重细节啊!

 

posted @ 2017-07-30 12:19  渊源谭  阅读(4013)  评论(0编辑  收藏  举报