「这是我参与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;
复制代码