`

java 几种性能优化的总结

 
阅读更多
1、使用StringBuilder
一般来说,使用 StringBuilder 的效果要优于使用 + 操作符。如果可能的话请在需要跨多个方法传递引用的情况下选择 StringBuilder,因为 String 要消耗额外的资源。JOOQ在生成复杂的SQL语句便使用了这样的方式。在整个抽象语法树(AST Abstract Syntax Tree)SQL传递过程中仅使用了一个 StringBuilder 。

更加悲剧的是,如果你仍在使用 StringBuffer 的话,那么用 StringBuilder 代替 StringBuffer 吧,毕竟需要同步字符串的情况真的不多。

2、不要使用iterator()方法
这条建议不适用于一般的场合,仅适用于在 N.O.P.E 分支深处的场景。尽管如此也应该有所了解。Java 5格式的循环写法非常的方便,以至于我们可以忘记内部的循环方法,比如:
for (String value : strings) {
    // Do something useful here
}

当每次代码运行到这个循环时,如果 strings 变量是一个 Iterable 的话,代码将会自动创建一个Iterator 的实例。如果使用的是 ArrayList 的话,虚拟机会自动在堆上为对象分配3个整数类型大小的内存。
private class Itr implements Iterator<E> {
    int cursor;
    int lastRet = -1;
    int expectedModCount = modCount;
    // ...

也可以用下面等价的循环方式来替代上面的 for 循环,仅仅是在栈上“浪费”了区区一个整形,相当划算。
for (int i = 0; i < size; i++) {
    String value : strings.get(i);
    // Do something useful here
}


如果循环中字符串的值是不怎么变化,也可用数组来实现循环。
for (String value : stringArray) {
    // Do something useful here
}


小结
无论是从易读写的角度来说,还是从API设计的角度来说迭代器、Iterable接口和 foreach 循环都是非常好用的。
但代价是,使用它们时是会额外在堆上为每个循环子创建一个对象。

3、使用entrySet()
当我们想遍历一个用键值对形式保存的 Map 时,必须要为下面的代码找到一个很好的理由:
for (K key : map.keySet()) {
    V value : map.get(key);
}

更不用说下面的写法:
for (Entry<K, V> entry : map.entrySet()) {
    K key = entry.getKey();
    V value = entry.getValue();
}


在我们使用 N.O.P.E. 分支应该慎用map。因为很多看似时间复杂度为 O(1) 的访问操作其实是由一系列的操作组成的。而且访问本身也不是免费的。至少,如果不得不使用map的话,那么要用 entrySet() 方法去迭代,这样的话,我们要访问的就仅仅是Map.Entry的实例。

小结
在需要迭代键值对形式的Map时一定要用 entrySet() 方法。

4.for循环优化

list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替。

避免在for循环中捕捉异常

提取与循环无关的表达式避免在for循环中进行一些无用的运算

5.集合初始化时初始化个数

6.尽量实现对象重用
系统要花时间生成对象,以后还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。

7.将闲置的资源进行释放
Java 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。

8.StringTokenizer代替substring()和indexOf()
StringTokenizer是java中object类的一个子类,继承自 Enumeration( public interface Enumeration实现 Enumeration(列举) 接口的对象,它生成一系列元素,一次生成一个)接口。

9.System.arraycopy()实现数组值的拷贝
两个数组间的复制建议不要使用循环,Java提供了一个数组拷贝的方法。

10.尽量指定类、方法的final修饰符

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java调用本地dll的几种方法性能对比测试

    java调用本地dll的几种方法性能对比测试。 JNA消耗的总时间(ms):5406 bridj消耗的总时间(ms):984 JNI消耗的总时间(ms):47 包含c++源码和java源码,部署和使用方法。在win7和winxp下测试用过。 部分源码是...

    Java优化编程(第2版)

    8.7 几种ejb的结合应用规则 8.8 提高ejb应用性能的其他途径 小结 第9章 jms性能优化 9.1 jms消息收发模式及其各自适用场合 9.2 发送与接收jms消息 9.3 优化jms中的会话对象 9.4 优化连接对象 9.5 优化消息目的地...

    网站性能优化 Web开发 JSP java

    2.缓存技术(当数据更新比较快,几秒钟更新一次,或者需要实时反映数据变化,或者页面具有很多种风格,不便于生成静态页面) 页面缓存(局部缓存和全局缓存)(View,html代码) 缺点:不能做到实时更新 优点:比二...

    常用的后端性能优化六种方式:缓存化+服务化+异步化等

    后端性能优化六种方式:缓存化、服务化、异步化等 在软件开发中,后端性能优化是一个非常重要的方面。一个高性能的后端系统可以提高用户体验、增加系统的可扩展性和可维护性、本降低系统的运营成本。今天我们将讨论...

    一份超级详细的Java面试题【大厂面试真题+Java学习指南+工作总结】

    工作总结!日志打印的15个建议 ...记一次接口性能优化实践总结:优化接口性能的八个建议 程序员必备基础:如何安全传输存储用户密码? 一次代码优化实践,用了模板方法+策略+工厂方法模式 保证接口数据安全的10种方案

    Java虚拟机JVM性能优化(二):编译器

    主要介绍了Java虚拟机JVM性能优化(二):编译器,本文先是讲解了不同种类的编译器,并对客户端编译,服务器端编译器和多层编译的运行性能进行了对比,然后给出了几种常见的JVM优化方法,需要的朋友可以参考下

    从虚拟机视角谈Java应用性能优化

    最后通过实例来介绍几种主要的JavaProfiler工具对我们进行开发和分析的帮助。本文要求读者具有一定的Java虚拟机的基础知识,一定的Java设计模式和开发经验。通过阅读本文,读者能从Java运行的本质上对性能方面有一个...

    java 面试题 总结

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byte...

    JAVA上百实例源码以及开源项目

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    JAVA上百实例源码以及开源项目源代码

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    java面试常见问题.docx

    Java中的访问修饰符有哪几种?它们的区别是什么? 请解释Java中的抽象类和接口的概念及区别是什么? 请解释Java中的泛型(Generic)是什么?它有什么作用? Java中的异常处理机制是什么?如何处理异常? 请解释Java...

    java 内部排序算法的性能分析

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 [需求分析] (1)对起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较; (2)待排序表的表长不小于100...

    Java常见面试题208道.docx

    178.如何做 mysql 的性能优化? 十八、Redis 179.redis 是什么?都有哪些使用场景? 180.redis 有哪些功能? 181.redis 和 memecache 有什么区别? 182.redis 为什么是单线程的? 183.什么是缓存穿透?怎么解决? ...

    JAVA性能调优 – 概述

    性能低的几个直观表现(4个) 执行速度慢 内存消耗过多,甚至溢出 启动时间太长 负载承受差,当系统压力上升的时候,系统的执行速度、响应时间急速下降 评价性能高低的指标(6个) ...几种软件优化的

    Java面试宝典2010版

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

    java面试题

    51.5. java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 25 52. 数据连接池 25 52.1. 连接池的基本原理: 25 52.2. 连接池的工作机制 25 52.3. 建立连接池 26 ...

    JAVA 进程在64位LINUX下占用巨大内存的分析.doc

    因此,为了解决这个问题,我们可以采取以下几种方法:首先,减少 HEAP 的配置大小,例如将 MaxHeapSize 降低到 2GB,PermSize 降低到 64MB。其次,优化 Young Generation 和 Old Generation 的使用率,例如使用 G1 ...

    内置几种了常用的弹窗,十几种良好的动画,将弹窗和动画的自定义设计的极其简单

    内置几种了常用的弹窗,十几种良好的动画,将弹窗和动画的自定义设计的极其简单;目前还没有出现XPopup实现不了的弹窗效果。 内置弹窗允许你使用项目已有的布局,同时还能用上XPopup提供的动画,交互和逻辑封装。UI...

    Java面试宝典-经典

    46、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 29 47、sleep() 和 wait() 有什么区别? 30 48、同步和异步有何异同,在什么情况下分别使用他们?举例说明...

Global site tag (gtag.js) - Google Analytics