Java Web实战篇-代码之美

双子孤狼 2018-01-12 16:44:25 ⋅ 1029 阅读


对于提升代码的运行效率 优化一两处代码对于整体的运行效率意义不大,如果能够把写优质代码的习惯保持在一个项目中这样就非常有用。

小编建议在项目编写代码的过程中,多注意代码编写细节,选择最优最简洁的编写方案,会减少很多生产上位置的错误,也会减少很多排查问题的工作量。

代码优化的最终目标:

  1. 减少代码的体积

  2. 提升代码的运行效率

  3. 减少生产Bug

减少变量的重复计算

对于方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。

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

上面这个for循环处理逻辑我想大家在开发过程中经常使用,如果实际业务中循环次数比较少 对于整体性能影响不大,但是在高并发、并且循环次数多的情况下就会影响性能,可以改为:

   for(int i= 0,length = list.size ; i < length; i++){
       ........
    }

如上代码块,当list.size()很大的时候,就会减少非常多的性能消耗。

使用懒加载,需要的使用才去创建

请看如下代码:

    String val = "123";    if(i == 1){          list.add(val);
    }

可以修改为:

      if(i == 1){
           String val = "123";             list.add(val);
       }

try...catch...不在循环中使用,可以放到最外层进行捕捉

指定类、方法的final修饰符

大家都知道带有final修饰符的类是不可派生的,例如java.lang.String 整个类都是final的,如果为类制定final修饰符可以让类不被继承,为方法指定final修饰符可以让方法不可以被重写。

如果指定了一个类为final,该类所有的方法都是final。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%。

尽量重用对象

比如String对象的使用,如果出现多个字符串连接时应该使用StringBuilder/StringBuffer代替。Java的虚拟机需要花费时间生成对象,还要花费时间把对象进行垃圾回收和处理,所以生成过多的对象会对程序的性能带来很大的影响。

使用局部变量

在调用方法的时候传递参数和在调用中创建的临时变量都可以保存在栈中,这样速度较快,而其他的变量(如静态变量、实例变量等),都在堆中创建,速度比较慢。

另外,栈中创建的变量,随着方法的执行结束,这些数据就没了,不需要再额外的垃圾回收。

流要使用完成后要及时关闭

在实际开发过程中数据库连接、I/O流等使用时,使用完毕后要进行关闭释放资源,不然会降低系统性能,增加内存开销,甚至严重生产Bug。

使用System.arraycopy()复制大量数据

复制大量数据的时候可以使用java.lang.System.arraycopy() 方法复制指定的源数组的数组,在指定的位置开始,到目标数组的指定位置。

使用移位运算符

java中有三种移位运算符:

<<      :     左移运算符,num << 1,相当于num乘以2>>      :     右移运算符,num >> 1,相当于num除以2>>>    :     无符号右移,忽略符号位,空位都以0补齐

用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的。

循环内不要创建对象引用

例如:

   for(int i = 0; i < 100; i++){       Object obj = new Object();
       ........
   }

上述代码会在内存中有100个Object对象,如果循环的次数更多就会消耗更多的内存,可以修改为:

  Object obj = null;  for (int i = 0; i < 100; i++)
  {
      obj = new Object();
      .......
  }

上述代码处理,在内存中只有一份Object 对象,每次new 的时候指向不同的Object,大大的减少内存的消耗。

静态变量合理使用

如果对某个对象定义为static 静态变量,那么系统将不会回收这个对象所占的内存,例如:

public class Test{
    private static  A = new A();
}

清除不需要的会话

应用服务器设置的默认会话超时的时间一般为30分钟,如果应用服务器需要保存更多的会话时,如果内存不足那么操作系统会把部分数据转移到磁盘,应用服务器也可能根据MRU(最近最频繁使用)算法把部分不活跃的会话转储到磁盘,甚至可能抛出内存不足的异常。

如果会话要被转储到磁盘,那么必须要先被序列化,在大规模集群中,对对象进行序列化的代价是很昂贵的。

可以及时调用HttpSession的invalidate()方法清除不再需要的会话。

声明大写命名的static final常量

在系统编译期间就把内容放入常量池中,避免运行期间计算生成常量的值。并且将常量的名字以大写命名可以方便区分出常量与变量 。

不要创建一些不使用的对象,不要导入一些不使用的类

这毫无用处,如果代码中出现”The value of the local variable i is not used”、”The import java.util is never used”,那么就删除这些无用的内容 。

程序运行过程中尽量不使用反射

反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高。

字符串变量和字符串常量equals的时候将字符串常量写在前面

例如:

    String val = “123”;    if (val.equals(“123”)){
        .....…
    }

可以修改为:

    String val = “123”;    if (“ 123”.equals(val)){
        .....…
    }

可以有效避免空指针异常。

字符串基本类型转换

基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+””最慢

long或者Long初始赋值时,使用大写的L而不是小写的l,因为字母l极易与数字1混淆。

好了,小萌暂时就整理这么多。每一点小小的优化就能规避掉很多未知的代码,也能让自己的代码更整洁、执行效率更高效。

更多精彩内容欢迎关注“IT实战联盟”公众号哦~~~



全部评论: 0

    我有话说:

    Java Web实战:发布和运维必备的12条Linux命令

    作为一名Java起步的从业人员,学会一些常用的Linux命令是必须的。

    Java Web实战-轻松提高千万级数据库查询效率

    通过优化数据库设计、java后台和数据库优化达到提高千万级数据查询的效率。

    Java Web实战:增强for循环实现原理及for循环实战性能优化

    Iterator是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator被创建之后会建立一个指向原来对象的单链索引表......

    JAVA实现附近范围内公交定位问题

    接上【前端实战:通过JS抓取城市所有站点与线路】获取附近定位信息

    Java Web架构实战:聊一聊前后端分离架构

    RESTful思想和Json数据标准的出现,使得这种交互日益便利。Vue.js 用于构建用户界面的渐进式框架

    「开源资讯」陌陌安全团队开源Java静态代码审计插件

    陌陌安全本次开源的Java静态代码安全审计插件,侧重于在编码过程中发现项目潜在的安全风险,并提供一键修复能力。 此插件作为Java项目静态代码安全审计工具,侧重于在编码过程中发现项目潜在的安全风险

    Apache Wicket 9.3.0 发布,Java Web 开发框架

    Apache Wicket 9.3.0 现已发布。Wicket 是一个 Java 语言的 Web 开发框架,与 Struts、WebWork、Tapestry 相类似,其特点在于对

    Java 实战-JDK9新特性体验

    JDK9 已经出来好几个月了,我们一起来了解一下JDK9的一些新特性吧

    前端实战:JavaScript 反调试技巧的简单应用(下)

    通过时间差异、DevTools检测(Chrome)、隐式流完整性控制和 代理对象来达到JavaScript反调试目的

    精品推荐:Java核心数据结构(List,Map,Set)使用技巧与优化

    JDK提供了一组主要的数据结构实现,如List、Map、Set等常用数据结构。这些数据都继承自 java.util.Collection 接口,并位于 java.util 包内。

    Google发布Java 核心工具库——Guava 28.0

    Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和

    蚂蚁金服 Java RPC 开源框架—SOFARPC

    SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。

    Gradle 5.0 RC2 发布,支持 Java 11、Kotlin DSL 生产就绪

    Gradle 5.0 RC2 发布了,Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具,支持依赖管理和多项目,类似 Maven,但比简单轻便。

    微信开发神器全能微信Java开发工具包

    必须分享的微信神器 weixin-java-tools

    精品推荐:一览GitHub上最受程序欢迎的5大Java开源项目

    列举了GitHub上一些最流行的Java项目。从Mockitos到Guava,以及 java-design-patterns等供大家学习。

    2017 年度编程语言榜,Java 最流行、JavaScript 最没价值?

    2017 年度编程语言榜,Java 最流行、JavaScript 最没价值?

    GitHub精选:2018年11月份最热门的Java开源项目

    又到了揭晓 11 月份最热门 Java 开源项目排名的时候了,在本月的名单中,出现了几个新面孔,如Java 核心知识库、轻量级容错组件Resilience4j .....