博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数组/集合性能优化
阅读量:6843 次
发布时间:2019-06-26

本文共 1518 字,大约阅读时间需要 5 分钟。

1、 复制数组元素,使用System类arraycopy()方法替代循环赋值在数组之间复制元素

建议:System类arraycopy()方法复制数组元素

杜绝:循环赋值复制数组元素
原因: System类arraycopy()方法调用操作系统更底层函数,效率更高。
注:通过实测,在元素数量达到亿级别,两者都在几百毫秒,都很快,System类arraycopy()比循环赋值性能仅快1倍,但仍推荐使用System类arraycopy()。

2、避免创建集合不设置初始容量

使用集合(List、Set、Map)存储大量的对象

建议:先估计存储的元素个数,然后在创建集合时设置集合的容量值要大于估计的元素个数。
杜绝:未设置集合容量值
原因:创建集合对象,如果未设置集合初始容量值,则使用默认值,而默认值都很小(如,ArrayList的初始容量为10),一旦存储的元素个数超过阈值,会造成集合扩容。扩容方式是根据扩容因子创建一个新的集合对象(初始容量=原有集合容量*扩容因子),再将原有集合中的元素拷贝到新的集合中。如果产生多次扩容,则会产生很多无用的中间集合对象,以及多次无意义的元素拷贝,性能低下。
正确示例: 估计存储的元素个数最大为10000,使用ArrayList集合

List list = new ArrayList(10000);

3、遍历集合,使用迭代器替代循环调用带索引的get方法

遍历集合

建议:使用迭代器遍历集合
杜绝:循环调用带索引的get方法
原因:迭代器维护了遍历集合的“指针”及内部状态,它知道如何高效的遍历集合。而集合提供的带索引的get方法,对某些集合而言查找索引需要从第一个元素开始遍历(如LinkedList),效率非常低下。
注:虽然迭代器遍历某些特定集合性能并非最优,例如,遍历ArrayList,使用循环调用带索引的get方法就比迭代器性能略高一些,但是绝大多数情况下迭代器遍历集合都是最优的。对LinkedList,带索引的get方法要从第一个元素开始查找,使用循环调用带索引的get方法遍历效率非常低。
正确示例:

List list =…Iterator it = list.iterator();while(it.hasNext())    {        it.next()    }

错误示例:

List list =…for(int i=0; i< list.size(); i++){list.get(i)}

4、单线程使用HashMap/ArrayList集合,避免使用HashTable/Vector

单线程使用集合

建议:HashMap/ArrayList
杜绝:HashTable/Vector
原因:HashMap/ArrayList是线程非安全的,元素的增加、删除、查询未实现同步,没有锁的申请和释放开销。而HashTable/Vector是线程安全的,元素的增加、删除、查询实现同步,存在锁的申请和释放开销。

5、判断元素是否在集合中存在,使用HashSet/HashMap替代List

判断元素是否在集合中存在

建议:HashSet/HashMap
杜绝:List
原因:使用List集合存储元素,则需要比较List集合中的所有元素,才能判断查找的元素是否在集合中存在。
使用HashSet/HashMap存储元素,HashSet/HashMap会将所有元素或Key按hash值分桶存储。通过查找的元素或Key的hash值可快速找到其所在的桶,此步效率非常高(接近于数组的下标查找元素),然后只需比较桶上的元素即可判断元素是否在集合存在,比较次数大大降低。

转载地址:http://atcul.baihongyu.com/

你可能感兴趣的文章
在rhel7中搭建openstack kilo
查看>>
我的友情链接
查看>>
there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
查看>>
LINUX下多路径(multi-path)介绍及使用
查看>>
自动安装varnish shell脚本
查看>>
java内存管理以及GC
查看>>
php REST程序设计的uml图
查看>>
基于通信层的HTTP和SOAP消息跟踪
查看>>
cronolog切割tomcat日志以及日志导出方法
查看>>
shell计算掩码位数
查看>>
selenium webdriver 实例Opera w/python
查看>>
java体系结构
查看>>
redhat6.5使用CentOS6.5的yum源
查看>>
Spring使用内存数据库
查看>>
东华与东软两大软件公司
查看>>
我的友情链接
查看>>
JavaScript中confirm,alert,prompt的用法及返回值
查看>>
页面渲染深入解析
查看>>
centos6.5安装cacti监控(二)
查看>>
情冢(中)
查看>>