确保其他线程都结束,然后自己才结束
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;
}
}
网友评论