接上一篇
21.将常量声明为 STATIC FINAL
这样在编译运行时就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字进行大写。
22.程序运行过程中避免使用反射
反射是java提供给用户一个很强大的功能,但是功能强大效率却不是很高。不建议在程序运行过程中频繁是哦那个反射机制,特别是Method的invoke方法。如果确实必要,建议将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存。
23.使用数据库连接池和线程池
这两个池都是重用与对象的,前者可以避免频繁打开和关闭连接,后者可以避免频繁创建和销毁线程。
24.使用带缓冲的输入,输出流进行I/O操作
带缓冲的输入,输出流即:
BufferedReader,bufferedWrite,BufferedInputStream,BufferedOutputStream它们可以大大提升I/O的效率。
25.顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList理解这两个集合有何不同即可。
26.不要让public方法中有太多形参
public方法是对外提供的方法,如果给这些方法太多形参的话有两点坏处:
(1) 违反面相对象的思想,java讲究万物皆对象,太多形参,和java编程思想不和
(2) 参数较多会导致出错概率增加
27.字符串变量和字符串常量equals的时候将字符串常量写在前面
如:
Strring str = "123";
if(str.equals("123")) {
}
可以替换为:
Strring str = "123";
if("123".equals(str)) {
}
这么做是为了避免空指针的出现
28.不要对数组使用toString()方法
本意是想打印数组里的内容,却可能因为数组引用对象为空而导致空指针异常。虽然对数组toString()没有意义,但是对集合toString()是可以打印出集合中的内容的,因为集合的父类AbstractCollections重写了Object的toString()方法。
29.不要对超出范围的基本数据类型做向下强制转换
得到的结果绝对是错误的。
30.把一个基本数据类型转为字符串,对象点toString()是最快的方法,对象点valueOf(数据)次之,数据+""最慢
想把Integer i转为字符串类型,有三种方式:
(1) i.toString()
(2) i.valueOf(i)
(3) i+""
下面测试
public static void main(String[] args) {
int loopTime = 50000;
Integer i = 0;
long startTime = System.currentTimeMillis();
for(int j = 0 ;j < loopTime;j++) {
String str = String.valueOf(i);
}
System.out.println("String.valueOf():"+(System.currentTimeMillis()-startTime) +"ms");
startTime = System.currentTimeMillis();
for(int j = 0;j < loopTime;j++) {
String str = i.toString();
}
System.out.println("Integer.toString():"+(System.currentTimeMillis()- startTime) +"ms");
startTime = System.currentTimeMillis();
for(int j = 0 ;j < loopTime;j++) {
String str = i + "";
}
System.out.println("i+\"\":"+(System.currentTimeMillis()- startTime)+"ms");
}
结果:
String.valueOf():11ms;
Integer.toString():5ms;
i + "":25ms;
原理是:
(1) String.valueOf()方法调用了Integer.toString()方法,但是在调用前先做了一次空判断;
(2) Integer.toString()是直接调用;
(3) i + ""是使用了StringBuilder实现,先用了append方法拼接,在toString()获取字符串