Java解惑读书笔记1
1。奇偶判断,应该用i%2!=0为奇数来判断,因为当为负数的时候%2的结果可能会是-1,用i%2==1会出错。(i&1)!=0使用低位是否为1来判断是否奇偶。
2。小数精确计算。java中的float和double都是不太精确的,容易造成精度丢失,比如System.out.println(2.00-1.10);结果不是0.9而是0.8999999999999999。一次我们可以用long或者int来代替浮点数(比如0.9我们可以用200-110表示来计算,最后结果除以100.0F)。或者使用BigDecimal
3.int 相乘溢出!这个最常见了,在项目中经常出现多少天等于多少毫秒之类的,如果这样算long s = 25 * 24 * 3600 * 1000,最后s=-2134967296,怎么会溢出呢,原因是这几个都是整形,最大值是2147483647,所以25天就溢出了而24天是正常的,怎么办?把25改为25L即可,它会强制转化为long型再计算,如果我把1000改为1000L,像这样long s = 25 * 24 * 3600 * 1000L,可能会溢出吗?还是会,如果前面的数字超出整形就溢出,所以应该把左边的第一个数设置为long型。
4.字面常量,所以的字面常量都是int型,不管是10进制还是16进制,除非以L结尾表示他是long型。
5.窄数字拓展到宽数字的拓展。如果是char类型,一定是无符号拓展,因为char没有负数。其他的,如果之前是正数则无符号拓展,如果是负数则有符号拓展。记住这点即可。
6.这个和上面的相似。(byte)0x90 == 0x90 吗?不等于,因为左边的会被拓展成int,而byte这个是负数,会有符号拓展,最后结果是负数和0x90当然不相等,可以加一个掩码0xFF把前面的负数去除即可 (byte)0x90 & 0xFF == 0x90,
按位与0xFF的意思是只保留数字的低8位,高位按0处理。
7.三元表达式(:?)。讨论起表达式的值,a?b:c这样的,如果b或者c一个是int或者long字面常量,而另一个是char byte short等变量,则表达式类型为char byte short。如果没有一个是字面常量,则拓展为最宽的作为表达式类型。举例
char x = 'X';int i = 65;System.out.println(true ? x : 65);// XSystem.out.println(false ? x : 65);// A。注意这里不是65System.out.println(true ? i : x);// 65System.out.println(false ? i : x);// 88。注意这里不是X
int i=10033333;byte b = 12;//编译无措,结果会溢出b += i;//编译错误 :cannot convert from int to byte//b = b + i;
System.out.println(-1 << 31);// -2147483648 向左移31%32=31位System.out.println(-1 << 32);// -1 向左移32%32=0位System.out.println(-1 << 33);// -2 向左移33%32=1位System.out.println(-1 << 1);// -2 向左移1%32=1位System.out.println(-1L << 63);// -9223372036854775808 向左移63%64=63位System.out.println(-1L << 64);// -1 向左移64%64=0位System.out.println(-1L << 65);// -2 向左移65%64=1位
// 為了兼容以前版本,1.5不會自動拆箱System.out.println(new Integer(0) == new Integer(0));// false// 1.4编译非法,1.5会自动拆箱System.out.println(new Integer(0) == 0);// true
public int compare(Integer i1, Integer i2) {return (i1 < i2 ? -1 : (i1 == i2 ? 0 : 1));}