zoukankan      html  css  js  c++  java
  • java笔记--笔试中极容易出错的表达式的陷阱

      我相信每一个学过java的人儿们都被java表达式虐过,各种"肯定是它,我不可能错!",然后各种"尼玛,真假,怎么可能?",虽然在实际开发中很少会真的让你去使用那些知识,但熟悉表达式的陷阱对于理解java数据类型在内存中的存储和运算以及JVM工作的原理有很大的帮助,最主要的,面试题太能考这些玩意了,有些坑当时爬出来了,过几天再做又会义无反顾的跳进去,于是我整理了自己做错过的一些题,也搜集了一些充满恶意的表达式方面的小题目,放在此处,警世:

    问题  

    结果          

    脱坑必备

    System.out.println(-11%-7.1);                                                                 -4                     

    a.第一个操作数提供最终结果的符号                                                                         

    b.两个数的绝对值的计算结果提供最终的计算结果

    int a = 1;
    int b = 2;
    System.out.println((a=3) + (b=4) + a*b);

    19

    JVM执行这个表达式是按从左到右执行的,虽然乘除的优先级高于加减,但这里不会进行先乘除后加减的,此题较为简单.

    int a = 10;
    int b = 10;
    double c = 10.0;
    System.out.println(a==b);
    System.out.println(a==c);                                                                                               

     true

    true

    第一个true很简单,不解释                                                                                                                                          

    第二个true是因为:

    先将a的值由int->double,然后比较a与c的值

    结论:==比较基本数据类型时会先同一成更高精度的类型,再比较其值                                                                                                                                                             

    System.out.println(3.0*10==30.0);
    System.out.println(3.14*10==31.4);
    System.out.println(3.1415*10==31.415);

    true

    false

    false

    这题不用太过纠结,只需要记住,

    计算机用二进制来表示小数的,对于某些小数,二进制无法精确表示

    Integer i=1;
    Integer j=1;
    System.out.println(i==j);

    i=127;j=127;

    System.out.println(i==j);

    i=128;j=128;

    System.out.println(i==j);

     true

     true

     false

     java自动装箱功能:

    首先判断当前值的范围是不是在byte的表示范围内-128~127

    如果在此范围内,JVM在内存中创建一个数组,该数组有256个数,在此范围内的值的创建直接从数组中取,如果超出范围,就会自己创建,所以前两个输出true,第三个输出false.

    int a = 2;
    int b = 1;
    int c = a > b ? (a = 4) : (b = 3);
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);

     4

     1

     4

     

    三目运算时,如果条件表达式确认了取哪一个值,那么另一个值
    将不再进行运算

    System.out.println( true ? false : true ? false : true );

    false

    JVM运算过程:读到true->读到?(得知这是一个三目运算符)->读到false->读到":"(得知false是第一个数据)->读取":"后面的内容(不管有什么都当做是第二个数据).

    所以运算形式是:true?false:(true?false:true).

    int a = 1;
    a+= a+= a++;
    System.out.println(a);

     3

     JVM运算过程:1.a=a+(a+=a++) ->2.a=1+(a=a+(a++)) ->3.a=1+(a=1+(a++)) ->4. a=1+(a=1+1)->5.a=1+2->6.a=3.

    short s1 = 1; s1 += 1;
    System.out.println(s1);
    short s2 = 1; s2 =s2+1;
    System.out.println(s2);

     2

    编译报错

      对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译

     对于short s2 = 1; s2 = s2 + 1; 由于s2+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s2时,编译器将报告需要强制转换类型的错误

    //第一个
    int a = 10;
    double d = 9.5;
    System.out.println(a > d ? a : d);
    //第二个
    System.out.println(3>2?'a':true);
    //第三个
    char a = 'a';
    int c = 0;
    System.out.println(true ? a : 0);
    System.out.println(false ? c : a);

     10.0

     a

     a

    97

     三目运算符的第二个和第三个数的数据类型如果不一致,会进行强制转换,这里int->double

    第一个:返回类型是double:int类型的10转成了double类型的10.0

    第二个:返回类型是Object:char类型和boolean类型无法进行统一,则都转化为Object,不会抛异常

    第三个:

      1:返回类型是char:0和i都是int类型,但0是常量,常量int的0可以用char来表示

      2:返回类型是int:i是变量,所以要对char和int类型进行类型统一,统一后为int

        以后再碰到会整理到这里...

  • 相关阅读:
    2018-10-20-WPF-通过位处理合并图片
    2019-2-11-WPF-获取应用的所有窗口
    2019-2-11-WPF-获取应用的所有窗口
    2018-8-10-WPF-如何在绑定失败异常
    2018-8-10-WPF-如何在绑定失败异常
    类和对象
    类和对象
    什么是可串行化MVCC
    LeetCode-环形链表|+环形链表||
    用js仿探探拖拽卡片的效果、飞卡片的效果,感觉挺酷,最后有美女看哦!
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5421701.html
Copyright © 2011-2022 走看看