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)外。