Java代码优化细节
代码优化细节 1、尽量指定类、方法的final修饰符 2、尽量重用对象 3、尽可能使用局部变量 4、及时关闭流 5、尽量减少对变量的重复计算 for(inti = 0; i < list.size(); i++) for(inti = 0,length = list.size(); i < length; i++) 6、尽量采用懒加载的策略,即在需要的时候才创建 7、慎用异常 8、不要在循环中使用try…catch…,应该把其放在最外层 根据网友们提出的意见,这一点我认为值得商榷 9、如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度 10、当复制大量数据时,使用System.arraycopy()命令 11、乘法和除法使用移位操作 12、循环内不要不断创建对象引用 例如: for(inti = 1; i <= count; i++) { Object obj = newObject(); } 这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为: Object obj = null; for(inti = 0; i <= count; i++) { obj = newObject(); } 这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间了。 13、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList 14、尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销 15、不要将数组声明为public static final 因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变 16、尽量在合适的场合使用单例 17、尽量避免随意使用静态变量 public class A { private static B b = newB(); } 此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止 18、及时清除不再需要的会话 19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历 if(list instanceofRandomAccess) { for(inti = 0; i < list.size(); i++){} } else { Iterator<?> iterator = list.iterable(); while(iterator.hasNext()){iterator.next()} } foreach循环的底层实现原理就是迭代器Iterator,所以后半句”反过来,如果是顺序访问的,则使用Iterator会效率更高”的意思就是顺序访问的那些类实例,使用foreach循环去遍历。 20、使用同步代码块替代同步方法 21、将常量声明为static final,并以大写命名 22、不要创建一些不使用的对象,不要导入一些不使用的类 这毫无意义,如果代码中出现”The value of the local variable i is not used”、”The import java.util is never used”,那么请删除这些无用的内容 23、程序运行过程中避免使用反射 24、使用数据库连接池和线程池 25、使用带缓冲的输入输出流进行IO操作 带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率 26、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList 这个,理解ArrayList和LinkedList的原理就知道了 27、不要让public方法中有太多的形参 public方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处: 1)、违反了面向对象的编程思想,Java讲求一切都是对象,太多的形参,和面向对象的编程思想并不契合 28、字符串变量和字符串常量equals的时候将字符串常量写在前面 String str = "123"; if(str.equals("123")) { ... } 建议修改为: String str = "123"; if("123".equals(str)) { ... } 这么做主要是可以避免空指针异常 32、不要对超出范围的基本数据类型做向下强制转型 33、把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+”"最慢 publicstatic void main(String[] args) { intloopTime = 50000; Integer i = 0; longstartTime = System.currentTimeMillis(); for(intj = 0; j < loopTime; j++) { String str = String.valueOf(i); } System.out.println("String.valueOf():"+ (System.currentTimeMillis() - startTime) + "ms"); startTime = System.currentTimeMillis(); for(intj = 0; j < loopTime; j++) { String str = i.toString(); } System.out.println("Integer.toString():"+ (System.currentTimeMillis() - startTime) + "ms"); startTime = System.currentTimeMillis(); for(intj = 0; j < loopTime; j++) { String str = i + ""; } System.out.println("i + "":" + (System.currentTimeMillis() - startTime) + "ms"); } 运行结果为: String.valueOf():11ms Integer.toString():5ms i + "":25ms 所以以后遇到把一个基本数据类型转为String的时候,优先考虑使用toString()方法。至于为什么,很简单: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |