与实俱进-提高Java代码质量与性能
一、概述
程序开发,就像写一篇文章一样,不单单是给功能实现出来,重要的是要追求代码量少,并且性能还好。提高代码质量与性能,有助于提高运行效率。
二、提高Java代码质量与性能实践
2.1、代码优化细节
尽量重用对象:想必我们会对接到第三方公司API,对接的时候通常会有签名参数,该参数是通过对多个参数拼接后进行MD5加密而得到。处理此问题,一般人会想到直接使用String去拼接即可,但是有没有考虑到性能和可拓展下呢?从性能上进行分析,如果使用String的话,会由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,很耗时间;从可拓展下进行分析,如果拼接的时候对方多个或者少个参数,我们还需要修改拼接的这个过程。解决方案是出现字符串连接时应该使用StringBuilder/StringBuffer代替,并且封装一套拼接算法。如下是HttpUtil工具类的toParams方法。
/**
* 将Map形式的Form表单数据转换为Url参数形式<br> * paramMap中如果key为空(null和"")会被忽略,如果value为null,会被做为空白符("")<br> * 会自动url编码键和值
* <pre> * key1=v1&key2=&key3=v3
* </pre>*
* @param paramMap 表单数据
* @param charset 编码
* @return url参数
*/
public static String toParams(Map paramMap, Charset charset) {
if (CollectionUtil.isEmpty(paramMap)) {
return StrUtil.EMPTY;
}
if (null == charset) {// 默认编码为系统编码
charset = CharsetUtil.CHARSET_UTF_8;
}
final StringBuilder sb =new StringBuilder();
boolean isFirst =true;
String key;
Object value;
String valueStr;
for (Entry item : paramMap.entrySet()) {
if (isFirst) {
isFirst =false;
}else {
sb.append("&");
}
key = item.getKey();
value = item.getValue();
if (valueinstanceof Iterable) {
value = CollectionUtil.join((Iterable) value,",");
}else if (valueinstanceof Iterator) {
value = CollectionUtil.join((Iterator) value,",");
}
valueStr = Convert.toStr(value);
if (StrUtil.isNotEmpty(key)) {
sb.append(URLUtil.encodeQuery(key, charset)).append("=");
if (StrUtil.isNotEmpty(valueStr)) {
sb.append(URLUtil.encodeQuery(valueStr, charset));
}
}
}
return sb.toString();
}
当复制大量数据时,使用System.arraycopy命令:前段时间讲解了socke通信可以改变线程的运行状态,以达到在后端页面手动控制定时任务。
在从Socket读取到的客户端buffer数据进行处理时,可以使用System.arraycopy方法。
重要词意分析:
MD5加密:
String对象拼接字符串: