Java:代码优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:代码优化相关的知识,希望对你有一定的参考价值。

代码优化,任重而道远!

代码细节的优化,如溪流聚成大海。

一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。

例如:

优化代码可能仅让单次请求效率提升1毫秒,但每天的请求是100万次,那么就是100万毫秒的效率提升!

1、尽量使用局部变量

局部的常量参数变量和对象引用都保存在栈中。栈区的数据在超过作用域后,会自动释放掉,不需要交给GC垃圾回收器处理。

2、尽量重用对象

特别是String对象,如需拼接字符串:

Java(三):代码优化_Java

因为虚拟机不仅要花时间生成对象,以后还需要花时间对这些对象进行垃圾回收,因此生成过多的对象将会给程序的性能带来较大的影响。

3、尽量减少对变量的重复计算

第一个例子每次循环,都要运行一次list.size()方法获取集合的记录数,如果list集合数据量很多的话,那么是严重影响运行效率的。改成用第二个例子,则可以减少很多的消耗。

Java(三):代码优化_内存空间_02

4、及时关闭流

Java开发过程中,少不了要操作数据库、IO读写。进行这些操作时务必要谨慎,在使用完毕后,需要及时关闭以及释放资源。因为这些大对象操作会对系统造成很大的开销,稍有不慎后果严重。

5、不要在循环中使用 try catch

在循环中使用try catch 会导致出现异常后依然继续执行循环的情况出现!

6、慎用异常

抛出异常首先是要创建对象的,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建 了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。

7、循环内尽可能不要创建对象

创建对象是需要开辟内存空间的,如果需要遍历的集合数据量很大,就会很消耗内存了。

第二个例子,内存中只有一个Object对象的引用,指向的是同一个内存地址。只是每次new Object()的时候,Object对象引用指向不同的Object,但是内存中只有一份,这样就打打节省内存空间了。

Java(三):代码优化_创建对象_03

8、循环内尽可能不要查询数据库

查询数据库、连接数据库都是需要占用时间,消耗资源,所以会严重影响数据库的性能。

解决方案推荐是尽可能可以一次性把所需要的结果查询出来(联表、where in)。

9、使用带缓冲的输入输出流进行IO操作

带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。

10、使用最有效率的方式去遍历Map

只是想遍历一下这个Map的key值,那用”Set<String> keySet = hm.keySet();”会比较合适一些。

Java(三):代码优化_创建对象_04

11、尽量避免使用静态变量

当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的


此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止

12、集合返回值优化

在工作中,经常会遇到,返回集合给前端,前端不接受集合会有null值的情况。通常我们都会新创建一个空的集合返回给前端。都知道,创建新对象都是需要开辟内存空间的。其实我们可以改成用Collections下面自带的emptyList()、emptySet()、emptyMap() 。

Java(三):代码优化_Java_05

通过查看Collections的源码,我们可以发现List、Set、Map返回的是一个独立的全局对象,所以这样返回相对来说节省空间。

Java(三):代码优化_内存空间_06

当然他们的返回值也是有一点坑的。

Java(三):代码优化_创建对象_07

代码优化还有很多,后续再慢慢补上。有更好的建议,欢迎补充~

以上是关于Java:代码优化的主要内容,如果未能解决你的问题,请参考以下文章

JAVA性能优化

Java性能优化推荐书!java中date转换为给定格式

十大经典排序--计数排序及其优化

高吞吐低延迟 Java 应用的 GC 优化实践

Android 使用Stringformat优化你的代码吧

java 之数据类型