Java数组/集合性能优化

  • 时间:
  • 浏览:3
  • 来源:uu快3输钱_uu快3赢钱诀窍_豹子

单tcp连接使用集合

建议:HashMap/ArrayList

杜绝:HashTable/Vector

是因为分析:HashMap/ArrayList是tcp连接非安全的,元素的增加、删除、查询未实现同步,没办法 锁的申请和释放开销。而HashTable/Vector是tcp连接安全的,元素的增加、删除、查询实现同步,处在锁的申请和释放开销。

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

1、 好友克隆数组元素,使用System类arraycopy()法律方式替代循环赋值在数组之间好友克隆元素

错误示例:

使用集合(List、Set、Map)存储几瓶的对象

建议:先估计存储的元素个数,而且在创建集合时设置集合的容量值要大于估计的元素个数。

杜绝:未设置集合容量值

是因为分析:创建集合对象,可能性未设置集合初始容量值,则使用默认值,而默认值都很小(如,ArrayList的初始容量为10),一旦存储的元素个数超过阈值,会造成集合扩容。扩容法律方式是根据扩容因子创建另有另有一个 新的集合对象(初始容量=原有集合容量*扩容因子),再将原有集合中的元素拷贝到新的集合中。可能性产生多次扩容,则会产生太大太大太大太大否是用的里边集合对象,以及多次无意义的元素拷贝,性能低下。

正确示例: 估计存储的元素个数最大为300,使用ArrayList集合

遍历集合

建议:使用迭代器遍历集合

杜绝:循环调用带索引的get法律方式

是因为分析:迭代器维护了遍历集合的“指针”及外部情况,它知道如何高效的遍历集合。而集合提供的带索引的get法律方式,对太大太大集合而言查找索引须要从第另有另有一个 元素始于遍历(如LinkedList),强度非常低下。

注:着实迭代器遍历太大太大特定集合性能难能可贵最优,类似,遍历ArrayList,使用循环调用带索引的get法律方式就比迭代器性能略高太大太大,而且绝大多数情况下迭代器遍历集合前会 最优的。对LinkedList,带索引的get法律方式要从第另有另有一个 元素始于查找,使用循环调用带索引的get法律方式遍历强度非常低。

正确示例:

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

建议:HashSet/HashMap

杜绝:List

是因为分析:使用List集合存储元素,则须要比较List集合中的所有元素,才能判断查找的元素否是是在集合中处在。

使用HashSet/HashMap存储元素,HashSet/HashMap会将所有元素或Key按hash值分桶存储。通过查找的元素或Key的hash值可快速找到其所在的桶,此步强度非常高(接近于数组的下标查找元素),而且只需比较桶上的元素即可判断元素否是是在集合处在,比较次数大大降低。

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

2、正确处理创建集合不设置初始容量

建议:System类arraycopy()法律方式好友克隆数组元素

杜绝:循环赋值好友克隆数组元素

是因为分析: System类arraycopy()法律方式调用操作系统更底层函数,强度更高。

注:通过实测,在元素数量达到亿级别,两者前会 几百毫秒,都迅速,System类arraycopy()比循环赋值性能仅快1倍,但仍推荐使用System类arraycopy()。

4、单tcp连接使用HashMap/ArrayList集合,正确处理使用HashTable/Vector