Android Java代码优化(一)

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

Android Java代码优化(一)

由于现在Android原生的语言还有kotlin存在,而这篇文章还是讲的是java代码的优化,所以区分一下标题‘Java代码优化’,该文章主要讲解编程中值得注意的优化。

优化的本质

优化的目的是在于保障程序的健壮性,当程序能够正常运行时,有时候也没有必要花费太多时间。

循环优化

看一个例子,请大家注意这样的代码,在循转中调用了方法,所以getList()会执行多遍,带来性能上的损耗。

public static void main(String[] args) {
        for (int i = 0; i < getList().size(); i++) {

        }
    }

    public static List<String> getList() {
        System.out.println("test");
        List<String> stringList = new ArrayList<>();
        stringList.add("1");
        stringList.add("2");
        stringList.add("3");
        return stringList;
    }
复制代码

即使个将getList()作为临时变量存储起来,依旧会多次执行size()方法,错误例子比如

 public static void main(String[] args) {
        List<String> list = getList();
        for (int i = 0; i < list.size(); i++) {

        }
    }
复制代码

所以正确的执行方法是

 public static void main(String[] args) {
        for (int i = 0, size = getList().size(); i < size; i++) {

        }
    }
复制代码

上诉的例子验证了一个观点

永远不要在for循环的第二个参数使用方法调用

尽量使用局部变量

局部变量在使用完时,就处于不可视阶段,垃圾回收机制也会尽快的回收它们。

使用StringBuilder和StringBuffer代替String

虽然这三个对象都可以实现拼接字符串的功能,但是它们会有很大的性能顺序之分,因为String本身是存在常量池中,它对的任何改变都不影响到原对象,相关的任何改变都会生成新的对象。

来看看它们三者的区别。

  • StringBuilder是非同步的、线程不安全的,效率最高。
  • StringBuffer是线程安全,效率低于StringBuilder,多线程中操作不需要另外加锁;
  • String存储于常量池,效率最慢,频繁的改变不可取。

来验证一下它们的效率。

public static void main(String[] args) {
        long times = System.currentTimeMillis();
        String string = "";
        for (int i = 0; i < 10000; i++) {
            string = string + "a";
        }
        System.out.println("间隔:" + (System.currentTimeMillis() - times)); // 304
    }
复制代码
public static void main(String[] args) {
        long times = System.currentTimeMillis();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 10000; i++) {
            stringBuffer.append("a");
        }
        System.out.println("间隔:" + (System.currentTimeMillis() - times)); // 20
    }
复制代码
 public static void main(String[] args) {
        long times = System.currentTimeMillis();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            stringBuilder.append("a");
        }
        System.out.println("间隔:" + (System.currentTimeMillis() - times)); // 15
    }
复制代码

我尝试一万次的拼接字符串,从结论看出,StringBuild 和 String 相比,差距巨大。

及时释放对象

其实回收机制会自动回收一些不再使用的对象,一般情况下,我们不用手动回收,我们只能建议/提醒它回收。 什么意思呢?

就是我们将Null赋值给这个对象即可。

if(obj == null)
create obj;
...
obj = null;
复制代码

猜你喜欢

转载自juejin.im/post/7033600735778603022