java代码的优化


参考了一些Java开发手册有关代码的规范,觉得一段好的代码可以从三个维度去分析.1)性能,2)可扩展性,3)可读性

让我们看看别人是怎么去分析,还有值得我们去学习的地方,也是我正在要求自己的条件

一、性能考虑

1、必须注意,不对数据库层做任何操作,如果业务的确需要,那也最后注解说明原因

2、尽量减少对变量的重复计算

  在不做任何编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快

 for (int i=0; i< list.size(); i++)
{.....} //建议修改为:
for (int i=0; length =list.size(); i<length; i++)
{.....}

这样list.size只会调用一次,减少性能消耗

3、尽量采用懒加载的策略,即在需要的时候才创建

这个习惯我本人会慢慢去培养,在写逻辑的时候,尤其是创建对象的时候是否需要考虑懒加载

例如:

    A  a= new A();
if (i==1)
{
list.add(a);
} //建议替换为:
if (i==1)
{
A a = new A();
list.add(a);
}

4、字符串的累积

 1)循环外:字符串拼接可以直接使用String的+操作,没有必要通过StringBuilder进行append

 2)  循环内:好的做法是在循环外声明StringBuilder对象,在循环内进行append,不论循环多少层都只有一个StringBuilder对象

反编译的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费

     StringBuffer sb = new StringBuffer();
sb.append("a");
sb.append("b");
sb.append("c"); //不在循环体内其实可以直接用加号,优化后一行代码:
String sb="a"+"b”+"c";

有关JDK不同版本对String拼接的优化可以参考:jdk不同版本对String拼接的优化分析

5、尽量避免使用split

split由于支持正则表达式,所以效率比较低

替代

        String  str1="a,b,c,d,e,,g";
//可以考虑使用apache的StringUtils.split(string,char)
List<String> list=Arrays.asList(StringUtils.split(str,","));
//可以考虑guava工具
List<String> list1=Splitter.on(",").splitToList(str1);

6、确定StringBuffer的容量

  StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组,在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,在丢弃旧的数组,在大多数情况下,你可以在创建

StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能

例子:

  

        StringBuffer  buffer = new Stringbuffer();
buffer.append("hello");
//更正为:为stringbuffer提供寝大小,一般循环体内使用都可以知道大小
StringBuffer buffer = new StringBuffer(max);
buffer.append("hello");

7、使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法

它的add/remove/clear 方法会抛出UnsupportedOperationException异常

说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法,Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组

    String[]   str = new String[]{"a","b"};
List list = Arrays.asList(str)
//第一种情况:list.add("c");运行时异常
//第二种情况:str[0] = "gujin"; 那么list.get(0)也会随之修改

8、查找数组元素,可以用Arrays.asList(T[] array).contains(T obj)

二、可读性考虑

1、推荐尽量少用else,if-else的方式

可以考虑:

  

    if(condition){
....
return obj;
}
//接着写else的业务逻辑代码;

说明:如果非得使用if()...else if()...else()..方式表达逻辑,【强制】请勿超过3层,超过请使用策略设计模式

正例:逻辑上超过3层的if..else代码可以使用卫语句,或者状态模式来实现

2、在if/else/for/while/do语句中必须使用大括号,即使只有一行代码

避免使用:if(condition) statements;

3、使用条件操作符替代"if(cond)return; else return;"结构

    //条件操作符更加的简洁
if(isdone){
return 0;
}else{
return 0;
} //更正
return (isdone?0:10);

4、Object的equals方法容易抛出空指针异常,应使用常量或确定有值得对象来调用equals

正例:"test".equals(Object);

反例:Object.equals("test");

说明:推荐使用java.util.Objects(JDK7引入的工具类)

5、不允许出现任何魔法值(即未经定义的常量)直接出现在代码中

反例:

    String key = "Id#taobao_"+tradeId;
cache.put(key,value);

6、取反操作符()降低程序的可读性,所以不要总是使用

 

 
boolean method(boolean a, boolean b){
if(!a)
return !a;
else
return !b;
}

7、注释掉的代码尽量要配合说明,而不是简单的注释块

  代码块被注释掉有两种可能性:1)后续会恢复此段代码逻辑,2)永久不用,前者如果没有备注信息,难以知晓注释动机,后者建议直接删掉(代码仓库保存了历史代码)

8、特殊注释标记,请注明标记人与标记时间

  1.待办事宜(TODO)标记人,标记时间,[预处理时间] 表示需要实现,但目前还未实现的功能

  2.错误不能工作(FIXME)(标记人,标记时间,[预处理时间]在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况)

java代码(11) ---java代码的优化的更多相关文章

  1. Java虚拟机11:运行期优化

    前言 http://www.cnblogs.com/xrq730/p/4839245.html,HotSpot采用的是解释器+编译器并存的架构,之前的这篇文章里面已经讲过了,本文只是把即时编译器这块再 ...

  2. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  3. uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码

    项目介绍 二次开发 uiautomatorviewer 优化定位符生成,支持生成Java,Python自动化代码,修复自带工具画面有动态加载时截图失败问题,优化自带工具截图速度 ,实现类似录制脚本功能 ...

  4. Java编写高质量代码改善程序的151个建议

    第一章  Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...

  5. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  6. 从 Java 代码到 Java 堆

    本文将为您提供 Java 代码内存使用情况的深入见解,包括将 int 值置入一个 Integer 对象的内存开销.对象委托的成本和不同集合类型的内存效率.您将了解到如何确定应用程序中的哪些位置效率低下 ...

  7. 编写高质量代码:改善Java程序的151个建议(第8章:异常___建议114~117)

    建议114:不要在构造函数中抛出异常 Java异常的机制有三种: Error类及其子类表示的是错误,它是不需要程序员处理也不能处理的异常,比如VirtualMachineError虚拟机错误,Thre ...

  8. 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)

    建议56:自由选择字符串拼接方法 对一个字符串拼接有三种方法:加号.concat方法及StringBuilder(或StringBuffer ,由于StringBuffer的方法与StringBuil ...

  9. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  10. java获取当前日期时间代码总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值.  方法如下: 要使用 java.util.Date .获取当前时间的代码如下  代码如下 复制代码 Date date = new ...

随机推荐

  1. dede文章列表根据权重自定义排序

    首先在这里说明一下,网上搜索织梦文章列表自定义的方式无非有以下几种: 1.修改配置文件,新增一个orderid字段,想法很好,但是!但是!!!可能是早期版本的缘故,不适合现在的v5.7系统!按照网上说 ...

  2. 类文件结构——深入理解Java虚拟机 笔记三

    在之前的笔记中记录过,Java程序变成可执行文件的步骤是:源代码-->经过编译变成class文件-->经过JVM虚拟机变成可执行的二进制文件.因此,为了对JVM执行程序的过程有一个好的了解 ...

  3. 减少 zabbix 频繁报警

    一直以来困扰的我问题是,触发器一旦触发,便会猛报警,如果你设置了email ,你的邮箱绝对会爆掉. 今天终于找到了方案,很简单,就是增加action 的steps ,从一个增加到default dur ...

  4. MCP3421使用详解

    0 摘要 因某项目需要,需要采集微弱的电压信号,且对电压精度要求较高,于是选中MCP3421这款18 bit 高精度IIC AD转换芯片.本文将结合MCP3421的手册,对该芯片的使用进行详细解释,并 ...

  5. Liquibase使用小结

    简介 Liquibase是一个用于跟踪.管理和应用数据库变化的开源数据库重构工具.它将所有数据库的变化保存在XML文件中,便于版本控制和项目部署升级.在快速搭建项目的JHipster框架中集成了该工具 ...

  6. layui 让弹窗始终居中于屏幕

    前话:今天用 layer.confirm()  弹窗的时候,滚动到页面尾部再弹窗时,发现弹窗还显示在上面,要滚动会上面才能看到. 度娘找了一个获取滚动条位置的方法: function ScollPos ...

  7. scipy.sparse的一些整理

    一.scipy.sparse中七种稀疏矩阵类型 1.bsr_matrix:分块压缩稀疏行格式 介绍 BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引, ...

  8. Android常用五大布局

    一.说明 1.每个应用程序都默认包含一个主界面布局文件(.xml). 2.位于项目的app/src/main/res/layout目录. 3.宽度和高度的属性 match_parent:强制性的使使徒 ...

  9. LNMP PHP升级脚本

    升级PHP前,请确认你的网站程序是否支持升级到的PHP版本,防止升级到网站程序不兼容的PHP版本,具体可以去你使用的PHP程序的官网查询相关版本支持信息.v1.3及以后版本大部分情况下也可以进行降级操 ...

  10. Unity自定义Log

    有如下两种方式,第一种借助了Unity自身的LogType枚举型:第二种则是纯粹地自己定义: public class Log { public Log(string message, UnityEn ...