代码片

2019-01-18  本文已影响0人  luckee

确保其他线程都结束,然后自己才结束

while(Thread.activeCount() > 1) {
  Thread.yeild();
}

防止书写错误

if(null == obj)if(obj == null)作用都是一样的,但是前者可以避免写成obj = null的错误

避免空指针

"hello".equals(str)str.equals("hello"),前者可以避免空指针

定义参数个数可变的方法

private static int sum( int[] values) { 
} 
private static int sum( int... values) { 
} 

判断是否是2的幂次方

public static boolean isPowerOf2(int n) {
  return (n & -n) == n
}

说明:以整形正数为例,如果一个数是2的幂次方,那么其最高位(指非0最高位)肯定为1,且其他位为0,形如0000...10000...;计算机计算数值是用数值的补码,正数的补码是本身,负数的补码是对应的正数全部位按位取反再加1,那么0000...10000...按位取反得到形如1111...01111...,再加1得到形如1111...10000...,然后0000...10000...1111...10000...按位与得到000...10000...,等于本身

求模运算技巧

计算机对于数值的计算是用补码的形式,而且CPU直接支持位运算。一般都是n%a的形式来求模,但如果a是2的幂次方,我们可以写成n & (a - 1)的形式来求模,&比%快很多,a - 1必然是0000...111...(低位是x位1)的形式,n & (a - 1)就可以得到n的低x位了,这低x位就是我们要求的余数。jdk的HashMap(数组+链表+红黑树实现)在添加元素时确定元素的插入位置就使用了这个技巧,要求容量capacity(即桶的数量,也是数组的长度,注意装载因子的计算是size/capacity)必须是2的幂次方,对key求得hash码之后,对capacity进行求模运算,就得到元素应该插入的位置

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    
    i = (table.length - 1) & hash;//这一步是在后面添加元素putVal()方法中进行位置的确定

打印异常类名,行号等信息

public class Test1 {

    public static void main(String args[]) {
        System.out.println(getLineInfo());
        getExp();
    }

    public static String getLineInfo() {
        StackTraceElement ste = new Throwable().getStackTrace()[1];
        return ste.getFileName() + ": Line " + ste.getLineNumber();
    }

    public static String getExp(){
        try{
            throw new Exception("Exception Test");
        }catch(Exception e){
            StackTraceElement ste =e.getStackTrace()[0];
            System.out.println(ste.getClassName());
            System.out.println(ste.getFileName());
            System.out.println(ste.getLineNumber());
            System.out.println(ste.getMethodName());
        }
        return null;
    }
}
上一篇下一篇

猜你喜欢

热点阅读