分享几个提高Java性能的高效用法_java

1.在重要的循环里,消除循环终止判断时的方法调用

复制代码 代码如下:

for(int i=0; i<collection.size(); i++)
{
...
}
for(int i=0; i<collection.size(); i++)
{
...
}

替换为…

复制代码 代码如下:

view plaincopy to clipboardprint?
for(int i=0;n=collection.size();i<n;i++)
{
...
}

2.通常,把与循环index不相关的移到循环的外面

复制代码 代码如下:

for(int i=0;terminal=x.length;i<terminal;i++){
 X[i]=x[i]/scaleA*scaleB;
}
for(int i=0;terminal=x.length;i<terminal;i++){
X[i]=x[i]/scaleA*scaleB;
}

改为

复制代码 代码如下:

double scale = scaleB/scaleA;
for(int i=0; terminal=x.length; i<terminal; i++){
 X[i]=x[i]*scale;
}

2.字符串

消除字符串连接
创建长字符串时,总是使用StringBuffter代替String
预先分配StringBuffer空间

StringBuffer sb = new StringBuffer(5000);

3.基本数据类型

在重要的循环里使用基本数据类型(int型数据通常比long/double型数据更快)
基本数据类型(Boolean,Integer,etc)的包装类主要用在当传递的方法参数必须是一个对象的引用时(而不是一个基本数据类型)
对所有的常量代数表达式使用static final修饰符

一 使常量更容易引用(编译器预先计算常量表达式)

4.异常

异常只用于单个真正的错误条件

一 抛出一个异常和执行一个catch代码块花费是很高的(主要由于当创建一个异常时要获得线程栈的一个快照)
一 只当条件真的异常时才抛出一个异常

使编译器和运行时最优化,将几个方法调用放在一个try/catch块中,而不是为每个方法调用实现几个try/catch块

5.基准

注意,所有这些技巧会因不同的平台和虚拟机而不同

一 例如:在有些servlet容器内,通过一个OutputStream作为字节输出会更快
一 在其它的容器内,通过一个PrintWriter输出字符会更快

这些技巧描述的是最可移植的建议

你可能需要运行一些基准来判断在你的平台上怎么样是最快的

时间: 2024-09-14 03:24:42

分享几个提高Java性能的高效用法_java的相关文章

如何优化JAVA程序设计和编码,提高JAVA性能

通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化.一般有两种方案:即优化代码或更改设计方法.我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能.而一个设计良好的程序能够精简代码,从而提高性能. 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧. 1.对象的生成和大小的调整. JAVA程序设计中一个普遍的问题就是没有好好的利用JAVA语言本身提供的函数,从而常常会生成大量的对象(或实例)

Java基础:减少对象的创建提高java性能

 许多通常的 Java 性能问题都起源于在设计过程早期中的类设计的思想, 早在许多开发者开始考虑性能问题之前. 在这个系列中, Brian Goetz 讨论了通常的 Java 性能上的冒险以及怎么在设计时候避免它们. 在第二部分, 他讨论了减少临时对象创建的一些技术. 虽然许多程序员把性能管理一直推迟到开发过程的最后, 性能考虑应该从第一天起就和设计周期结合在一起. 这个系列探索一些早期的设计思想能够极大影响应用程序性能的方法.在这篇文章里, 我继续探索大量临时对象创建的问题, 并且提供一些避免

Java性能优化技巧汇总_java

本文实例汇总了Java性能优化技巧.分享给大家供大家参考.具体分析如下: 这里参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量使用final修饰符. 带有final修饰符的类是不可派生的.在JAVA核心API中,有许多应用final的例子,例如java.lang.String.为String类指定final防止了使用者覆盖length()方法.另外,如

浅析java中stringBuilder的用法_java

String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵.如果要修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类.例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder类可以提升性能. 通过用一个重载的构造函数方法初始化变量,可以创建 Strin

详解Java中final的用法_java

概念 final 具有"不可改变的"的含义,可以修饰 非抽象类.非抽象成员方法和变量. 用 final 修饰的类不能被继承,没有子类. 用 final 修饰的方法不能被子类的方法覆盖(重写). 用 final 修饰的变量表示常量,只能被赋一次值(声明变量的时候). 注: final 不能用来修饰构造方法,因为"方法覆盖"这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖的关系,因此用final修饰构造方法没有任何意义.

java中enum的用法_java

本文实例讲述了java中enum的用法.分享给大家供大家参考.具体分析如下: 1. 基本用法 复制代码 代码如下: enum Day {     SUNDAY, MONDAY, TUESDAY, WENDSDAY, THURSDAY, FRIDAY, SATURDAY; } 枚举是常量,所以应该用大写. 2. 枚举是对象 枚举隐含地继承了java.lang.Enum,所以它具有java.lang.Enum的属性和方法.遍历枚举: 复制代码 代码如下: public class Main {   

java synchronized关键字的用法_java

0.先导的问题代码     下面的代码演示了一个计数器,两个线程同时对i进行累加的操作,各执行1000000次.我们期望的结果肯定是i=2000000.但是我们多次执行以后,会发现i的值永远小于2000000.这是因为,两个线程同时对i进行写入的时候,其中一个线程的结果会覆盖另外一个. public class AccountingSync implements Runnable { static int i = 0; public void increase() { i++; } @Overr

浅析java 的 static 关键字用法_java

本篇浅析java中static的用法,主要五个方面:静态成员变量,静态方法,静态块,静态内部类,静态导包. 首先还是一张表格说一下静态对象和非静态对象的区别: 静态对象 非静态对象 归属 类共同具有 类的各个实例独立拥有 内存分配 内存空间上固定的 附属类分配 分配空间顺序 优先分配静态对象空间 优先分配静态对象空间,初始化也一样 1 静态变量,静态方法,静态块 静态对象,静态方法都是在原对象和方法上加上static关键字修饰,表示类可以直接调用这些,而不需要实例化后再调用.具有的好处是: 1-

浅谈java中Map的用法_java

public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import javautilHashMap; import javautilMap; public class Test { public static void main(String[] args) { Map map = new HashMap();//声明一个Map mapput("s", "哈哈");//向map中放