android之java程序性能优化(不断补充)

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。一、避免在循环条件中使用复杂表达式在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。还有一个原则,决不在一个For语句中第二次调用一个类的方法例子: class cel

大家好,又见面了,我是全栈君。

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。

避免在循环条件中使用复杂表达式

在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。还有一个原则,决不在一个For语句中第二次调用一个类的方法

例子:

class cel {
    void method (vector vector) {
        for (int i = 0; i < vector.size (); i++)  // violation
            ; // ...
    }

优化:

 void method (vector vector) {
        int size = vector.size ();
        for (int i = 0; i < size; i++)
            ; // ...
    }

或者

 void method (vector vector) {
        for (int i = 0,size = vector.size ();i < size; i++)
            ; // ...
    }

二、让访问实例内变量的getter/setter方法变成”final”

例子:

 public void setsize (int size) {
         _size = size;
    }

优化:

final public void setsize (int size) {
         _size = size;
    }

三、在字符串相加的时候,使用 ‘ ‘ 代替 ” “,如果该字符串只有一个字符的话
例子:

public void method(string s) {
        string string = s + "d"  // violation.
        string = "abc" + "d"      // violation.
    }

优化:

 public void method(string s) {
        string string = s + 'd'
        string = "abc" + 'd'   
    }

四、将try/catch块移出循环
把try/catch块放入循环体内,会极大的影响性能,如果编译jit被关闭或者你所使用的是一个不带jit的jvm,性能会将下降21%之多
例子:

void method (fileinputstream fis) {
        for (int i = 0; i < size; i++) {
            try {                                      // violation
                _sum += fis.read();
            } catch (exception e) {}
        }
    }

优化;

void method (fileinputstream fis) {
        try {
            for (int i = 0; i < size; i++) {
                _sum += fis.read();
            }
        } catch (exception e) {}
    }

五、对于boolean值,避免不必要的等式判断
将一个boolean值与一个true比较是一个恒等操作(直接返回该boolean变量的值). 移走对于boolean的不必要操作至少会带来2个好处:
1)代码执行的更快 (生成的字节码少了5个字节);
2)代码也会更加干净

例子:

 boolean method (string string) {
        return string.endswith ("a") == true;   // violation
    }

优化:

 boolean method (string string) {
        return string.endswith ("a");
    }

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

例子:

 public int method(boolean isdone) {
        if (isdone) {
            return 0;
        } else {
            return 10;
        }
    }

优化:

public int method(boolean isdone) {
        return (isdone ? 0 : 10);
    }

七、使用条件操作符代替”if (cond) a = b; else a = c;” 结构
例子:

void method(boolean istrue) {
        if (istrue) {
            value = 0;
        } else {
            value = 1;
        }
    }

优化:

void method(boolean istrue) {
        _value = (istrue ? 0 : 1);       // compact expression.
    }

八、不要在循环体中实例化变量
在循环体中实例化临时变量将会增加内存消耗
例子:

void method (vector v) {
        int size = v.size();
        for (int i=0;i < size;i++) {
            object o = new object();
            o = v.elementat(i);
        }
    }

优化:

在循环体外定义变量,并反复使用

void method (vector v) {
        int size = v.size();
        object o;
        for (int i=0;i<size;i++) {
            o = v.elementat(i);
        }
    }

九、尽量使用final修饰符

带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如 java.lang.String。

为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高 50%。

十、尽量重用对象

特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。

十一、尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量(static),实例变量等,都在堆(Heap)中创建,速度较慢。尤其是static,尽量少用,如果程序中存在大量static,说明程序的设计有问题.(很可能会占用大量内存)

十二、不要重复初始化变量

默认情况下,调用类的构造函数时,java会把变量初始化成确定的值,所有的对象被设置成null,整数变量设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键字创建一个对象时,构造函数链中的所有构造函数都会被自动调用。

例如:

class test{
private Object obj; //不需要写成 private Object obj=null;
}

初始化就是赋值,赋值就是初始化
这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,public int state = this.getState();

十三、保证对象能够被及时回收

过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。 JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。

十四、采用在需要的时候才开始创建的策略

例如:

String str="abc";   
if(i==1){
 list.add(str);
}  

优化:

if(i==1){
 String str="abc";
 list.add(str);
}  

十五、不要将数组声明为:public static final

 

十六、array(数组)和ArrayList的使用

array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。

十七、应尽可能避免使用内在的GET,SET方法

像C++一样的编程语言,通常会使用Get方法(例如 i = getCount())去取代直接访问这个属性(i=mCount)。这在C++编程里面是一个很好的习惯,因为编译器会把访问方式设置为Inline,并且如果想约束或调试属性访问,你只需要在任何时候添加一些代码。在Android编程中,这不是一个很不好的主意。虚方法的调用会产生很多代价,比实例属性查询的代价还要多。我们应该在外部调用时使用Get和Set函数,但是在内部调用时,我们应该直接调用。

十八、尽量使用基本数据类型代替对象

 

十九、单线程应尽量使用 HashMap, ArrayList,除非必要,否则不推荐使用HashTable,Vector,她们使用了同步机制,而降低了性能

 

 

二十、未完待续.

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121446.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux安装pycharm全部过程「建议收藏」

    linux安装pycharm全部过程「建议收藏」一,安装文件传到虚拟机里在安装包目录下打开管理员小黑窗(安装包我会放在分享里,可以免费下载)scppycharm-community-2018.2.4.tarayh@192.168.66.130注:scp传输文件//pycharm-community-2018.2.4.tar文件名ayh为虚拟机名字//192.168.66.13…

    2022年10月19日
  • js获取现在时间_js中如何动态显示日期时间

    js获取现在时间_js中如何动态显示日期时间js可以通过Date对象获取当前日期和时间,使用Date()获取系统当前时间,在使用getFullYear()、getMonth()、getDate()、getHours()等方法获取特定格式的时间,在使用innerHTM方法显示。首先我们来了解一下js获取当前时间所需的一些方法:获取当前时间:vard=newDate();//获取系统当前时间获取特定格式的时间:1、获取当前年份getYear()方法:可以获取年份(2位或4位),其返回值是表示当前Date对象的年份字

  • 角点检测方法_什么叫五点取样法

    角点检测方法_什么叫五点取样法目录原理讲解【1】为何选取角点作为特征?【2】角点的定义:【3】判断角点的方法:【4】Harris角点检测法示例Opencv自带函数:cornerHarris()函数示例程序1示例程序2原理讲解【1】为何选取角点作为特征?角点是一种局部特征。角落上的可区分性特别强,边缘次之,平滑区域则基本没有区分性。【2】角点的定义:【3】判断角点的方法:这里有个细节:将计算的所有方向上的变化……

    2022年10月21日
  • 秒杀多线程第四篇 一个经典的多线程同步问题

    秒杀多线程第四篇 一个经典的多线程同步问题

  • 0~9迷你上标小数字复制_下标1

    0~9迷你上标小数字复制_下标1A⁰¹²³⁴⁵⁶⁷⁸⁹B₀₁₂₃₄₅₆₇₈₉

  • shell if 并且条件_shell编程if语句格式

    shell if 并且条件_shell编程if语句格式单分支if语句语法格式if[条件]then指令fi场景:单一条件,只有一个输出单分支if语句示例#!/bin/bash#单if语句的使用场景if[“$1″==”nan”]thenecho”您的性别是男”fi双分支if语句语法格式if[条件]then指令1else…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号