《Java 解惑》一、表达式谜题

1.奇数性
取余%定义:(a/b)*b + (a%b) == a

    // 1.奇数性
    public static boolean is0dd(int i) {
        // return i % 2 == 1;// 有误
        // return i % 2 != 0;// 正确
        return (i & 1) != 0;// & 替代 % 更好
    }

2.找零时刻

    double a = 2.00, b = 1.10;
    System.out.println(a - b);// 有误
    System.out.println(new BigDecimal(String.valueOf(a)).subtract(new BigDecimal(String.valueOf(b))));

并不是所有小数都可以用二进制浮点数精确表示
注:需要精确计算避免使用 float、double;货币计算使用 int、long、BigDecimal

3.长整除

    //final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;// 以int计算出现溢出,在赋值给long
    final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;// 正确
    final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
    System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);

4.初级问题

    System.out.println(12345+5432l);//1 锐角 l 直角 (水平笔画和竖直笔画)

注:长整型用大写 L,避免使用小写 l。

5.十六进制的趣事

    System.out.println(Long.toHexString(0x100000000L+0xcafebabe));//结果 cafebabe(改为0xcafebabeL可得想要结果)

注:十六进制转为二进制,最高位 1 表示负数 0 表示整数;long + int 先将int提升为long在想加减;避免混合类型的计算。

6.多重转型

    System.out.println((int) (char) (byte) -1);// bype->char有符号扩展
    char i = (char) (-1 & 0xff);// 掩码
    System.out.println(i);
    char c = 'a';
    int j = c & 0xffff;//不会执行符号扩展

7.互换内容

    int x = 2, y = 4;
    x ^= y ^= x ^= y;// 多次赋值引起程序混乱,可用临时变量实现互换
    System.out.println("x=" + x + ",y=" + y);// 结果 x=0,y=2

8.Dos Equis

    char x = 'X';
    int i = 0;
    System.out.println(true ? x : 0); //char
    System.out.println(false ? i : x);//int

注:在条件表达式中使用类型相同的第二个和第三个操作数。

9.半斤

    short x = 0;
    int i = 123456;
    // x = x + i;错误,可能丢精度
    x += i;// 隐式int->short
    System.out.println(x);

注:复合赋值操作隐士产生一个转型

10.八两

    Object o = "Effective ";
    String s = "Java";
    // o = o + s;
    o += s;
    System.out.println(o);

注:复合赋值操作符要求两个数都是原始类型(int , Integer)除了(String)外。

猜你喜欢

转载自blog.csdn.net/bluesky003/article/details/80275619