java提高代码效率_提高java代码运行效率

1.尽量在合适的场合使用单例

使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面

第一,控制资源的使用,通过线程同步来控制资源的并发访问

第二,控制实例的产生,以达到节约资源的目的

第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信

-

2.尽量避免随意使用静态变量

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

public class A{

static B b = new B();

}

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

-

3.尽量避免过多过常的创建java对象

尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最

大限度的重用对象,最好能用基本的数据类型或数组来替代对象。

-

4.尽量使用final修饰符

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。

-

5.尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。

6.尽量处理好包装类型和基本类型两者的使用场所

虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。

在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。

-

7.慎用synchronized,尽量减小synchronize的方法

都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,并且应尽量使用方法同步代替代码块同步。

-

8.尽量使用StringBuilder和StringBuffer进行字符串连接

这个就不多讲了

-

9.尽量不要使用finalize方法

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

-

10.尽量使用基本数据类型代替对象

String str = "hello";

上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;

String str = new String("hello");

此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

11.单线程应尽量使用HashMap, ArrayList

HashTable,Vector等使用了同步机制,降低了性能。

-

12.尽量合理的创建HashMap

当你要创建一个比较大的hashMap时,充分利用另一个构造函数

public HashMap(int initialCapacity, float loadFactor)

避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。

-

13.尽量减少对变量的重复计算

for(int i=0;i

应该改为

for(int i=0,len=list.size();i

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

-

14.尽量避免不必要的创建

A a = new A();

if(i==1){list.add(a);}

应该改为

if(i==1){

A a = new A();

list.add(a);}

-

15.尽量在finally块中释放资源

程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

15.尽量在finally块中释放资源

程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

-

16.尽量使用移位来代替'a/b'的操作

"/"是一个代价很高的操作,使用移位的操作将会更快和更有效

int num = a / 4;

int num = a / 8;

应该改为

int num = a >> 2;

int num = a >> 3;

但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解

-

17.尽量使用移位来代替'a*b'的操作

同样的,对于'*'操作,使用移位的操作将会更快和更有效

int num = a * 4;

int num = a * 8;

应该改为

int num = a << 2;

int num = a << 3;

-

18.尽量确定StringBuffer的容量

StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。

如:StringBuffer buffer = new StringBuffer(1000);

-

19.尽量早释放无用对象的引用

大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。

例如:

Public void test(){

Object obj = new Object();

……

Obj=null;

}

上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:

Public void test(){

Object obj = new Object();

……

Obj=null;

//执行耗时,耗内存操作;或调用耗时,耗内存的方法

……

}

这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。

-

20.尽量避免使用二维数组

二维数据占用的内存空间比一维数组多得多,大概10倍以上。

21.尽量避免使用split

除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

-

22.ArrayList & LinkedList

一个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2者得数据结构,对症下药。

-

23.尽量使用System.arraycopy ()代替通过来循环复制数组

System.arraycopy() 要比通过循环来复制数组快的多

-

24.尽量缓存经常使用的对象

尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。

25.尽量避免非常大的内存分配

有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志

摘要&#xff1a; 增长黑客系列&#xff1a;今天比昨天增长多少&#xff1f;快使用环比函数来分析日志 在我们平时分析业务时&#xff0c;一个最重要的指标就是&#xff0c;今天比昨天增长多少&#xff0c;本周比上周增长多少&#xff1b;或者同上一个周期相比增长最大的分类是…

flowable连线名称不显示bug修复说明

文章目录flowable连线不显示bug修复说明flowable连线不显示bug修复说明 在flowable6.4版本&#xff08;分享牛老师&#xff09;修复了流程图中连线不显示的bug。由于Flowable官方对于这个bug的缘由很清楚&#xff0c;所以很顺利的将该bug修复代码合并到官方代码了&#xff0c;…

云计算将会让数据中心消失?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 王洪鹏出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcould&#xff09;近年来企业应用云化明显&#xff0c;越来越多的企业开始将自己的公司业务转移到云平台之上&#xff0c;可能是迁到公有云&#xff0c;也可能是私有云…

巧用 Img / JavaScript 采集页面数据

摘要&#xff1a; 当我们有一个新内容时&#xff08;例如新功能、新活动、新游戏、新文章&#xff09;&#xff0c;作为运营人员总是迫不及待地希望能尽快传达到用户&#xff0c;因为这是获取用户的第一步、也是最重要的一步。 点此查看原文:http://click.aliyun.com/m/40929/…

mysql绕过waf_SQL注入中的WAF绕过技术

1.大小写绕过这个大家都很熟悉&#xff0c;对于一些太垃圾的WAF效果显著&#xff0c;比如拦截了union&#xff0c;那就使用Union UnIoN等等绕过。2.简单编码绕过比如WAF检测关键字&#xff0c;那么我们让他检测不到就可以了。比如检测union&#xff0c;那么我们就用%55也就是U的…

时间序列数据的存储和计算 - 开源时序数据库解析

摘要&#xff1a; Prometheus 开源时序数据库解析的系列文章在之前已经完成了几篇&#xff0c;对比分析了Hbase系的OpenTSDB、Cassandra系的KairosDB、BlueFlood及Heroic&#xff0c;最后是tsdb ranking top 1的InfluxDB。 点此查看原文&#xff1a;http://click.aliyun.com/m/…

flowable modler为任务节点增加自定义属性

如何在modler设计器中为任务节点&#xff0c;添加自定义的属性。 文章目录1、modler设计器中所有元素的定义2、flowable如何处理stencilset_bpmn.json文件3、为UserTask任务节点添加一个扩展属性3.1. 添加属性的名称3.2. 为任务节点添加扩展属性3.3. 查看效果1、modler设计器中…

微软对OpenAI投资10亿美元欲开发AI技术;华晨宝马宣布建成全球首个5G汽车生产基地;传苹果将收购英特尔调制解调器芯片业务...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 索尼Xperia 1R信息曝光&…

java se 与j2se_javaSE和 j2SE的区别?

javaSE和 j2SE的区别?关注:71 答案:4 mip版解决时间 2021-01-28 18:29提问者耍硪ミ倪配么2021-01-27 20:19javaSE和 j2SE的区别?最佳答案二级知识专家自然卷的气质2021-01-27 21:53JavaEE 比 se多了许多包&#xff0c;用于开发大规模的&#xff0c;分布式的Java应用/服务器…

[高速通道进阶一]如何理解高速通道的就近接入和一点接入连接全球

摘要&#xff1a; 经常有用户问&#xff0c;我在上海有个IDC&#xff0c;在北京有个VPC&#xff0c;我想通过专线把IDC和VPC连接起来&#xff0c;我是不是要找运营商直接拉一根上海到北京的专线&#xff1f;其实不是这样的&#xff0c;用户只需要接入到最近的接入点即可。高速通…

Flowable决策任务(decision task)

摘要&#xff1a;Flowable中引入了一个decision task&#xff08;我们可以将其称之为决策任务&#xff09;。在讲解decision task之前&#xff0c;我们不妨看一下dmn引擎。因为如果大家不了解dmn&#xff0c;那肯定不知道如何使用decision task了。 dmn是decision Modeling Not…

PyODPS 安装常见问题解决

摘要&#xff1a; 本文将用户安装 PyODPS 时遇到的常见问题列举如下&#xff0c;希望在遇到类似问题时可供借鉴。在参考下列步骤之前&#xff0c;请首先尝试卸载并重装 PyODPS。卸载的步骤为执行“pip uninstall pyodps”。 点此查看原文&#xff1a;http://click.aliyun.com/m…

flowable理论(一)工作流理论

文章目录一、工作流是什么&#xff1f;二、为什么要用工作流&#xff1f;三、市面上有哪些工作流&#xff1a;四、工作流的规范一、工作流是什么&#xff1f; 工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可…

5G精华问答 | 5G技术已经成熟了吗?

1G时我们用手机打电话&#xff0c;2G时我们能互发短信、看文字信息&#xff0c;3G时上网看图片&#xff0c;而4G时我们看视频和直播&#xff0c;从1G到4G&#xff0c;不仅信号越来越好&#xff0c;安全性越来越高&#xff0c;上网也越来越快了。1Q&#xff1a;5G技术已经成熟了…

python局部变量含义_Python的变量

1. 概念Python变量是用于存储值所在的内存位置。换句话说&#xff0c;python程序中的变量将数据提供给计算机进行处理。Python中的每个值都有一个数据类型。Python中不同的数据类型是Number&#xff0c;List&#xff0c;Tuple&#xff0c;String&#xff0c;Dictionary等。变量…

PyODPS DataFrame:统一的数据查询语言

摘要&#xff1a; 前几天&#xff0c;PyODPS发布了0.7版本&#xff0c;这篇文章给大家介绍下PyODPS新版本带来的重要特性。 之前也有若干篇文章介绍过了&#xff0c;我们PyODPS DataFrame是延迟执行的&#xff0c;在调用立即执行的方法&#xff0c;比如execute、persist等之前&…

flowable理论(三)flowable简介

flowable 2017发布&#xff0c;主创人员来自Activiti团队&#xff0c;目前支持BPMN和CMMN、DMN规范、它的主要含有五个引擎和一个官方自带的Modeler流程设计器&#xff0c;以及一套数据库表&#xff0c;以及发布版本&#xff08;5个war)/源代码等&#xff1a; 文章目录一、五大…

AliOS Things 持续集成(CI)系统介绍

摘要&#xff1a; AliOS Things在快速的迭代进化之中&#xff0c;如何保证提交的代码质量&#xff0c;并保证在各个硬件平台上的稳定性&#xff0c;是一个非常大的挑战。同时物联网硬件碎片化&#xff0c;资源紧张&#xff0c;对持续集成&#xff08;CI&#xff09;系统也提出了…

从青铜到王者,助力企业轻松上云的四大绝招!

戳蓝字“CSDN云计算”关注我们哦!IBM在7月份发生了很多大事&#xff0c;其中这两件你知道吗&#xff1f;第一&#xff0c;IBM&#xff08;NYSE: IBM&#xff09;与美国电话电报公司&#xff08;AT&T&#xff09;&#xff08;NYSE: T&#xff09;达成一项为期多年的战略联盟…

python模块用法教程_Python学习之asyncore模块用法实例教程

本文以实例分析了Python中asyncore模块的原理及用法&#xff0c;分享给大家供大家参考。具体分析如下&#xff1a;asyncore库是python的一个标准库&#xff0c;它是一个异步socket的包装。我们操作网络的时候可以直接使用socket等底层的库&#xff0c;但是asyncore使得我们可以…