1、乘法和除法使用移位操作
用移位操作可以极大地提高性能,因为在计算机底层,移位的操作是最方便,最快的。
2、尽量避免随意使用静态变量
要知道,当某个变量被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的。
3、字符串变量和字符串常量equals的时候将字符串常量写在前面
4、不要对数组使用toString()
想通过toString()打印出数组内容却有可能因为数组引用is为空而导致空指针异常。
5、使用最有效的方式遍历Map
遍历map的方式有很多,通常场景下我们需要的是遍历map中的key和value,那么推荐使用的是:如果你只想遍历一下这个map的key值,那用“set keySet=hm.keySet()”会比较合适一点
6、循环内不要不断创建对象的引用
7、使用StringBuilder来连接字符串
字符串连接是一个非常常见的操作,也是一个低效率的操作。简单的说,使用+=来追加字符串的问题在于每次操作都会分配新的String.
8、避免递归
导致出现StackOverFlowError错误的递归代码逻辑是java程序中常见的一种问题。
9、谨慎使用正则表达式
正则表达式在很多场景中都非常有用,但他们往往具有较高的性能成本。了解各种使用正则表达式的jdk字符串方法很重要,例如String.replaceAll().String.split().
10、避免创建或者销毁过多的线程
11、尽量指定类,方法的final修饰符
带有final修饰符的类是不可派生的。在java核心api中,有许多应用final的例子,例如java.lang.String,整个类都是final的,为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升java运行效率作用重大,具体可以查阅java运行期优化相关资料,此举能够使性能平均提升50%。
12、慎用异常
异常对性能不利,抛出异常首先要创建一个新的对象,Throwable接口的构造函数调用名为fillStackTrace()的本地同步方法,fillStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用于控制错误流程。
13、如果能估计到待添加内容的长度,为底层以数组的方式实现的集合,工具类指定初始长度。
比如ArrayList,LinkedList,StringBuilder,StringBuffer,HashMap,HashSet等。StringBuilder(String str)构造方法默认分配 16个字符加 str.length() 个字符空间,所以可以通过类的构造方法来设定它的初始化容量,这样可以明显地提升性能。
14、当复制大量数据时,使用System.arraycopy()命令。
15、尽量在合适的时候使用单例
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:
控制资源的使用,通过线程同步来控制资源的目的;
控制实例的产生,以达到节约资源的目的;
控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
16、及时清除不再需要的会话
为了清除不在活动的会话,许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多会话时,如果内存不足,那么操作系统会把部分数据转移到磁盘,应用服务器也可能根据MRU(最近最频繁使用)算法把部分不活跃的会话转储到磁盘,那么必须要先被序列化,在大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时,应当及时调用HttpSession的invalidate()方法清除对象。
17、实现RandomAccess接口的集合(比如ArrayList)应当使用最普通的for循环而不是foreach循环来遍历。
这是JDK推荐给用户的,JDK API对于RandomAccess接口的解释是实现RandomAccess接口用来表明其支持快速随机访问,此接口的主要目的是允许一般的算法更改其行为,从而将其应用到随机或连续访问列表时能提供良好的性能。实际经验表明,实现RandomAccess接口的类实例,假如是随机访问的,使用普通for循环效率将高于使用foreach循环,反过来,如果是顺序访问的,则使用Iterator会效率更高
18、将常量声明为static final,并以大写命名
这样在编译期间就可以把这些内容放入常量池中,避免运行期键计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量。
19、不要创建一些不使用的对象,不要导入一些不使用的类
这毫无意义,如果代码中出现“The value of the local variable i is not used”、“The import java.util is never used”,那么请删除这些无用的内容,虽说没啥影响,但是有些时候编译期会报错,譬如没import用到的类被删掉了。
20、程序运行过程中避免使用反射
不建议在程序运行的过程中使用,除非万不得已,尤其是频繁使用反射机制,特别是method的invoke方法,如果确实有必要,一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存中,用户只关心和对端交互的时候获取最快的响应速度,并不关心对端的项目启动花多久时间。
21、使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程。
22、使用带缓冲的输入输出流进行IO操作
带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。
23、公共的集合类中不使用的数据一定要及时remove掉
如果一个集合类是公用的(也就是说不是方法里面的属性),那么这个集合里面的元素是不会自动释放的,因为始终有引用指向他们。所以,如果公用集合里面的某些数据不适用而不去remove掉它们,那么将会造成这个公用集合不断增大,使得系统有内存泄漏的隐患。
24、把一个基本数据类型转换为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+“”最慢。
因为 String.valueOf() 方法底层调用了 Integer.toString() 方法,但是会在调用前做空判断;Integer.toString() 是直接调用;i + "" 底层使用了 StringBuilder 实现,先用 append 方法拼接,再用 toString() 方法获取字符串。