代码优化的目标是:
减小代码的体积
提高代码运行的效率
明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:
1
2
|
for
(
int
i =
0
; i < list.size(); i++)
{...}
|
建议替换为:
1
2
|
for
(
int
i =
0
, length = list.size(); i < length; i++)
{...}
|
这样,在list.size()很大的时候,就减少了很多的消耗
4. 尽量采用懒加载的策略,即在需要的时候才创建
例如:
1
2
3
4
5
|
String str =
"aaa"
;
if
(i ==
1
)
{
list.add(str);
}
|
建议替换为:
1
2
3
4
5
|
if
(i ==
1
)
{
String str =
"aaa"
;
list.add(str);
}
|
例如:
1
2
3
4
5
|
String str =
"aaa"
;
if
(i ==
1
)
{
list.add(str);
}
|
建议替换为:
1
2
3
4
5
|
if
(i ==
1
)
{
String str =
"aaa"
;
list.add(str);
}
|
6. 字符串变量和字符串常量equals的时候将字符串常量写在前面
这是一个比较常见的小技巧了,如果有以下代码:
1
2
3
4
5
|
String str =
"123"
;
if
(str.equals(
"123"
))
{
...
}
|
建议修改为:
1
2
3
4
5
|
String str =
"123"
;
if
(
"123"
.equals(str))
{
...
}
|
这么做主要是可以避免空指针异常
7. 使用最有效的方式去变量Map
遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value,那么推荐使用的、效率最高的方式是:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
static
void
main(String[] args)
{
HashMap<String, String> hm =
new
HashMap<String, String>();
hm.put(
"111"
,
"222"
);
Set<Map.Entry<String, String>> entrySet = hm.entrySet();
Iterator<Map.Entry<String, String>> iter = entrySet.iterator();
while
(iter.hasNext())
{
Map.Entry<String, String> entry = iter.next();
System.out.println(entry.getKey() +
""
+ entry.getValue());
}
}
|
如果你只是想遍历一下这个Map的key值,那用”Set<String> keySet = hm.keySet();”会比较合适一些
8.
把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+”"最慢
把一个基本数据类型转为一般有三种方式,我有一个Integer型数据i,可以使用i.toString()、String.valueOf(i)、i+”"三种方式,三种方式的效率如何,看一个测试:
public static void main(String[] args)
{
int loopTime = 50000;
Integer i = 0;
long startTime = System.currentTimeMillis();
for (int j = 0; j < loopTime; j++)
{
String str = String.valueOf(i);
}
System.out.println("String.valueOf():" + (System.currentTimeMillis() - startTime) + "ms");
startTime = System.currentTimeMillis();
for (int j = 0; j < loopTime; j++)
{
String str = i.toString();
}
System.out.println("Integer.toString():" + (System.currentTimeMillis() - startTime) + "ms");
startTime = System.currentTimeMillis();
for (int j = 0; j < loopTime; j++)
{
String str = i + "";
}
System.out.println("i + "":" + (System.currentTimeMillis() - startTime) + "ms");
}
运行结果为:
1
2
3
|
String.valueOf():11ms
Integer.toString():5ms
i +
""
:25ms
|
所以以后遇到把一个基本数据类型转为String的时候,优先考虑使用toString()方法。至于为什么,很简单:
String.valueOf()方法底层调用了Integer.toString()方法,但是会在调用前做空判断
Integer.toString()方法就不说了,直接调用了
i + “”底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串
三者对比下来,明显是2最快、1次之、3最慢