java 写 高效_jvm性能调优(四)-----编写高效的java代码

本文探讨了如何通过建造者模式管理过多的构造器参数,以及在工具类中避免无谓的对象创建,减少性能消耗。讲解了如何利用基本类型代替对象实例,以及字符串连接优化。还涉及了类设计中的可访问性最小化和终结方法的使用策略。
摘要由CSDN通过智能技术生成

构造器参数太多怎么办?

可以使用建造者模式,代码示例如下:

public classFoodBuilder {//required

private finalString foodName;private final intreilang;//optional

private intdanbz;private intdianfen;private intzf;private inttang;private intwss;privateFoodBuilder(Builder builder) {

foodName=builder.foodName;

reilang=builder.reilang;

danbz=builder.danbz;//.....

}public static classBuilder{//required

private finalString foodName;private final intreilang;//optional

private intdanbz;private intdianfen;private intzf;private inttang;private intwss;public Builder(String foodName, intreilang) {super();this.foodName =foodName;this.reilang =reilang;

}public Builder danbz(intval) {this.danbz =val;return this;

}//.......

publicFoodBuilder build() {return new FoodBuilder(this);

}

}public static voidmain(String[] args) {

FoodBuilder foodBuilder= new Builder("food2", 1000).danbz(100)//.....

.build();

}

}

不需要实例化的类应该构造器私有

对于很多工具类,提供的都是静态方法,需要将构造器私有化,例如jdk中的Arrays类

4c14c5f5d590a2df7da52b4d7b769f6c.png

不要创建不必要的对象

先看一段代码:

public classSum {public static voidmain(String[] args) {long start =System.currentTimeMillis();

Long sum= 0L;//对象

for(long i=0;i

sum= sum+i;//new 20多亿的Long的实例

}

System.out.println("spend time:"+(System.currentTimeMillis()-start)+"ms");

}

}

运行结果:

083cb38e0821eb97f05e1796ec7c6af1.png

代码修改下(将Long改成long):

public classSum {public static voidmain(String[] args) {long start =System.currentTimeMillis();long sum = 0L;//对象

for(long i=0;i

sum= sum+i;//new 20多亿的Long的实例

}

System.out.println("spend time:"+(System.currentTimeMillis()-start)+"ms");

}

}

运行结果:

93c9fcb81e7401f3af75ea6a1042ae27.png

也就是说,在能用基本数据类型的时候就不要用对象,因为对象的创建、销毁(涉及到GC),会大大增加性能损耗。

避免使用终结方法

就是不要使用Object对象中的finalize方法

protected void finalize() throws Throwable { }

尤其是在这个方法里面写逻辑,例如回收资源等,因为虚拟机不保证这个方法能及时被执行,或者说被执行。

使类和成员的可访问性最小化

主要目的就是解耦。

当心字符串连接的性能

public classTest {private static classLog{public static voiddebug(String msg){if(isDebug()) System.out.println(msg);

}public static booleanisDebug(){return false;

}

}public static voidmain(String[] args) {int count = 10000000;long start =System.currentTimeMillis();for(int i = 0;i

Log.debug("The system is running and the time is "

+System.currentTimeMillis()+" now,Let's do another thing:"+System.nanoTime());

}

System.out.println("直接打印模式,次数:"+count+":spend time :"

+(System.currentTimeMillis()-start)+"ms");

start=System.currentTimeMillis();for(int i = 0;i

Log.debug("The system is running and the time is "

+System.currentTimeMillis()+" now,Let's do another thing:"+System.nanoTime());

}

System.out.println("先判断再打印模式,次数:"+count+":spend time :"

+(System.currentTimeMillis()-start)+"ms");

}

}

运行结果:

172fdcf9d74ab85287ee02bd8ba8f31a.png

解释:上面的isDebug()一直返回的是false,所以下面一种写法不需要去拼接字符串,大大节省时间。这也是大部分开源框架(spring、mybatis等)打印日志前都会判断的一个原因。 并且如果字符串拼接过长的情况下,使用StringBuilder或StringBuffer。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值