数组之间的拷贝使用System.arrayCopy更加高效
byte[] ReceiveBytes = new byte[length1+ length2];
for (int i = 0; i < length1; i++) {
ReceiveBytes[i] =ReceiveBytes_temp1[i];
}
避免创建已经存在的Big Integer对象 ,如:(BigDecimal.ZERO,BigDecimal.ONE, BigDecimal.TEN)
避免创建已经存在的Boolean 对象;如:Boolean.TRUE, Boolean.FALSE
有Final修饰符的成员变量必须是静态的
避免显示调用垃圾回收
低效利用使用keySet迭代器而不是entrySet迭代器。
使用entrySet效率会比keySet高
for (String key : map.keySet()) {
//to do some thing
}
for (Entry entry : map.entrySet()) {
//to do some thing
}
避免在循环中使用“+” 连接字符串。使用Stringbuffer 或Stringbuilder
定义为Private类型方法从未被调用,应该被删除
使用ArrayList 替换Vector
如果从数组转换成一个List,用Arrays. AsList() 替换遍历数组的形式转换
避免创建无用的局部变量,如:
String s = getxx();
return s;
直接替换为return getxx();
当参数是单个字符的时候使用 String.indexOf(char)替换String.indexOf(String)
比如:用s.indexOf(‘a‘) 代替s.indexOf(“a”)
如:String s = new String();
正确写法 String s = “”;
如:String s = new String(“test”);
正确写法 String s = “test”;
Long, Integer, Short, Character, and Byte 使用valueOf代替直接实例化
Number 类型从-128 到127会缓存到常量池,可以节省内存
Integer i = new Integer(4);
Integer j = new Integer(4);
System.out.println(i==j);// false
i = Integer.valueOf(4);
j = Integer.valueOf(4);
System.out.println(i==j); // true
i = Integer.valueOf(128);
j = Integer.valueOf(128);
System.out.println(i==j);//false
对原始值进行装箱然后立即把它强制转换为另外一种原始类型。例如:
new Double(d).intValue()应该直接进行强制转换例如:(int)d
无用的包导入
无用的局部变量
未用的常规参数:避免传递给方法或构造器不使用的参数
代码中包含TODO注释
避免使用空代码块
有时候两个 if 语句可以通过布尔短路操作符分隔条件表达式组合成一条语句
如:
If(a==b){
If(c==1){
//do some thing
}
}
避免在 BigDecimal 类型的构造方法中用小数类型的字面量:人们常常以
为”new BigDecimal(0.1)”能精确等于 0.1, 其实不然,它等于“ 0. 1000000000000000055511151231257827021181583404541015625 ”,这 种状况的原因是 0.1 不能精确的表示双精度类型,因此,传入构造器的 long 类型不等于 0.1 ,而传入 String 类型的构造器 new BigDecimal(“0.1”) 可以精确等于 0.1, 故推荐这种情形时用 String 类型的构造器
破坏空检查:如果自身抛出空指针异常空检查就会遭到破坏,比如你使用 || 代替 && ,反之亦然。
if (string!=null ||!string.equals("")) { // 这里应该是&&
return string;
}
关闭资源:确保这些资源(譬如:Connection,Statement,和 ResultSet 对象)总在使用后被关闭
对象相等性比较:使用 equals()比较对象的引用,避免使用”==”来比较
String的split,replaceAll等方法传递的参数是正则表达式,正则表达式本身用到的字符需要转义,如:句点符号“.”,美元符号“$”,乘方符号“^”,大括号“{}”,方括号“[]”,圆括号“()”,竖线“|”,星号“*”,加号“+”,问号“?”等等,这些需要在前面加上“\\”转义符。
如:s = s.replaceAll(".", "/"); 应该使用s =s.replaceAll("\\.", "/");
明显的无限循环
明显的无限迭代循环,将导致堆栈溢出
重写equals 后必须重写hashCode
避免equals()方法和 null 比较
单元测试必须包含断言,而不是简单的打印结果后看输出。
对于不变类型的无用操作:对于不变类型对象 (String,BigDecimal 或BigInteger) 的操作不会改变对象本身,但操作结果是产生新的对象,所以操作的结果是错的
如:BigDecimal a=new BigDecimal(10);
a.add(newBigDecimal(5));
正确的写法:
BigDecimal bd=new BigDecimal(10);
bd = bd.add(new BigDecimal(5));
避免用== or != 比较 String
StringBuffer sb = new StringBuffer('c');
字符 c 会转换为 int 值,作为 StringBuffer 的初始化大小参数
public void doGet(HttpServletRequestrequest,HttpServletResponse response)throws ServletException,IOException{
String v = request.getParameter("v");
PrintWriter out = response.getWriter();
out.print("协议版本号不对,v="+v);
out.close();
}
这里字符串v没有作过滤,直接返回给用户,有可能操作XSS攻击
在代码中在JSP输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞
private static SimpleDateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");
避免使用静态的DateFormat,DateFormat 是非线程安全的
同上
清空集合使用clear() 代替removeAll()
在代码中避免使用e.printStackTrace,使用logger代替
代码中禁止使用System.println
While for 循环If Else 代码块必须使用大括号
为局部变量赋值,但在其后的没有对她做任何使用。通常,这表明一个错误,因为值从未使用过。
此方法使用相同的代码,以实现两个有条件的分支。检查以确保这是不是一个编码错误