提高代码效率的方法优化循环体循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。让我们看看下面的代码片:..Vectorvect=newVector(1000);...for(inti=0;i<vect.size();i++){...}for循环部分改写成:intsize=vect.size();for(inti=0;i<size;i++){...}如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。未优化耗时:780309优化后耗时:624430少用NEW初始化一个实例尽量少用new来初始化一个类的实例,当一个对象是用new进行初始化时,其构造函数链的所有构造函数都被调用到,所以new操作符是很消耗系统资源的,new一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。当new创建对象不可避免时,注意避免多次的使用new初始化一个对象。尽量在使用时再创建该对象。如:NewObjectobject=newNewObject();intvalue;if(i>0){value=object.getValue();}修改为:intvalue;if(i>0){NewObjectobject=newNewObject();value=object.getValue();}另外,应该尽量重复使用一个对象,而不是声明新的同类对象。一个重用对象的方法是改变对象的值,如可以通过setValue之类的方法改变对象的变量达到重用的目的。在Java中,一切都是对象,如果有方法(Method)调用,处理器先要检查该方法是属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。可以减少方法的调用,同样一个方法:{inti=0;...CallMethod(i);}publicvoidCallMethod(inti){if(i==0){return;}...//其他处理}可修改为:inti=0;...if(i==0){CallMethod(i);}不影响可读性等情况下,可以把几个小的方法合成一个大的方法。另外,在方法前加上final,private关键字有利于编译器的优化选择合适的方法调用尽量使用局部变量调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。例子:publicclassUSER{privateint_sum;privatestaticint_staticSum;voidgetSum(int[]values){for(inti=0;ivalues.length;i++){_sum+=values[i];//violation.}}}更正:如果可能,请使用局部变量作为你经常访问的变量。你可以按下面的方法来修改getSum()方法:voidgetSum(int[]values){intsum=_sum;//temporarylocalvariable.for(inti=0;ivalues.length;i++){sum+=values[i];}_sum=sum;}STRING与STRINGBUFFER的使用技巧1、字符串在JAVA中被广泛的使用,但是由于String对象是不可改变的,所以如果我们试图将两个String对象相加的时候,它实际的执行是产生一个中间对象StringBuffer,并调用它的append()法来进行相加的,最后调用StringBufffer的toString()方法来返回一个String的对象,如果只是一般的相加差别不大,但是如果是在循环中,性能差距就较明显注:Strings=“a”+“b”+“c”,实际上在编译后是Strings=“abc”,执行时不存在相加问题2、在字符串相加的时候,如果该字符串只有一个字符的话如:Stringstr=s+“d”应该换作string=s+‘d’来执行。3、由于在创建一个StringBuffer对象时,StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,如果可以的话,在创建StringBuffer的时候应指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。返回STRING与STRINGBUFFER的使用技巧尽可能的使用JAVA自身提供的API用JAVA自身的System.arraycopy方法明显省时不要重复初始化变量默认情况下,调用类的构造函数时,Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。避免不需要的造型操作所有的类都是直接或者间接继承自Object。同样,所有的子类也都隐含的“等于”其父类。那么,由子类造型至父类的操作就是不必要的了。例子:classUNC{String_id=UNC;}classDogextendsUNC{voidmethod(){Dogdog=newDog();UNCanimal=(UNC)dog;//notnecessary.Objecto=(Object)dog;//notnecessary.}}更正:classDogextendsUNC{voidmethod(){Dogdog=newDog();UNCanimal=dog;Objecto=dog;}}如果只是查找单个字符的话,用CHARAT()代替STARTSWITH()用一个字符作为参数调用startsWith()也会工作的很好,但从性能角度上来看,调用charAt更好例子:publicclassPCTS{privatevoidmethod(Strings){if(s.startsWith(a)){//violation//...}}}更正将'startsWith()'替换成'charAt()'.publicclassPCTS{privatevoidmethod(Strings){if('a'==s.charAt(0)){//...}}}不要在循环中调用SYNCHRONIZED(同步)方法方法的同步需要消耗相当大的资源,在一个循环中调用它绝对不是一个好主意。例子:importjava.util.Vector;publicclassSYN{publicsynchronizedvoidmethod(Objecto){}privatevoidtest(){for(inti=0;ivector.size();i++){method(vector.elementAt(i));//violation}}privateVectorvector=newVector(5,5);}不要在循环中调用SYNCHRONIZED(同步)方法更正:不要在循环体中调用同步方法,如果必须同步的话,推荐以下方式:importjava.util.Vector;publicclassSYN{publicvoidmethod(Objecto){}privatevoidtest(){synchronized{//在一个同步块中执行非同步方法for(inti=0;ivector.size();i++){method(vector.elementAt(i));}}}privateVectorvector=newVector(5,5);}ORACLE的SQL语句尽量使用大写在JAVA+ORACLE的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担。减少I/O操作尽量减少I/O操作:输入/输出(I/O)包括很多方面,我们知道,进行I/O操作是很消耗系统资源的。程序中应该尽量少用I/O操作。使用时可以注意:.合理控制输出函数System.out.println()对于大多时候是有用的,特别是系统调试的时候,但也会产生大量的信息出现在控制台和日志上,同时输出时,有序列化和同步的过程,造成了开销。特别是在发行版中,要合理的控制输出,可以在项目开发时,设计好一个Debug的工具类,在该类中可以实现输出开关,输出的级别,根据不同的情况进行不同的输出的控制。尽量使用缓存:读写内存要比读写硬盘上的文件要快很多,应尽可能使用缓冲,以便直接从内存中读取数据。尽可能使用带有Buffer的类代替没有Buffer的类,如可以用BufferedReader代替Reader,用BufferedWriter代替Writer来进行处理I/O操作。同样可以用BufferedInputStream代替InputStream都可以获得性能的提高即时关闭I/O流操作Java编程过程中,I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。在FINALLY块中关闭STREAM程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。例子:importjava.io.*;publicclassCS{publicstaticvoidmain(Stringargs[]){CScs=newCS();cs.method();}publicvoidmethod(){try{FileInputStreamfis=newFileInputStream(CS.java);intcount=0;while(fis.read()!=-1)count++;System.out.println(count);fis.close();}catch(FileNotFoundExceptione1){}catch(IOExceptione2){}}}更正:在最后一个catch后添加一个finally块对象使用完毕应手动置成NULL由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。慎用异常异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。尽量不要在循环中使用TRYCATCHTry{}catch(){}如无特殊要求,应把其放置在最外层。比如数据回滚集合类优化问题集合类在此Java编程中被广泛地使用,一个集合类就是将一组对象组装成一个对象Java的集合类框架由一些接口(如Collection、List、Set、Map)和一些为通用目的而实现的类(如Vector,ArrayList、Hashtable等等)组成,这些类里,有些提供了某种排序算法,有的提供了同步的方法,