之前一直都是看得多写得少(其实基本就没有写过),在iteye,csdn都开过blog,可是都不多写,感受贡献太少,从今天起要开始努力了,将本身日常用到的,学到的以为有意思的写出来跟你们一块儿分享,共同进步。 java
以前看过《Java Puzzlers》一书,以为颇有意思,最近再翻一遍,将其中一些很tricky的东西作个笔记,与你们分享。都不是本身的原创,版权属于原做者,这本书不错,你们有兴趣的话能够买一本~http://book.douban.com/subject/1473329/ 测试
问题: code
public static boolean isOdd(int i) { return i % 2 == 1; }能够正确的判断i的奇偶性么?
正解: blog
不能够,当i为负数时候,i % 2 == -1,由于Java中对%的定义以下 get
(a / b) * b + (a % b) == a, it
可是Java的整数相除采用了截尾操做。正确代码以下: class
public class Main1 { public static boolean isOdd(int i) { return i % 2 == 1; } public static boolean isOdd_2(int i) { return i % 2 != 0; } public static boolean isOdd_3(int i) { return (i & 1) != 0; } public static void main(String[] args) { //Java整数除法采用截尾操做,%运算知足:(a / b) * b + (a % b) == a,所以%的结果老是与作操做数(被除数)的符号一致 System.out.printf("%d %d\n", 5 / 2, 5 % 2); System.out.printf("%d %d\n", -5 / 2, -5 % 2); System.out.printf("%d %d\n", 5 / (-2), 5 % (-2)); System.out.printf("%d %d\n", 5 / (-2), 5 % (-2)); System.out.println(isOdd(-11)); System.out.println(isOdd_2(-11)); System.out.println(isOdd_3(-11)); int N = 1000000; long start = System.currentTimeMillis(); for (int i = 0; i < N; i++) { isOdd_2(i); } long end = System.currentTimeMillis(); System.out.printf("isOdd_2 takes: %d\n", end - start); start = System.currentTimeMillis(); for (int i = 0; i < N; i++) { isOdd_3(i); } end = System.currentTimeMillis(); System.out.printf("isOdd_3 takes: %d \n", end - start); } }经过测试能够发现,&比%快了很多,所以最好的方法是isOdd_3,速度快,并且不影响代码可读性~