1
package eli.sample;
2
3
/** *//**
4
* char[]和StringBuilder字符处理测试,
5
* 验证创建对象的时间耗费。
6
* <p>
7
* <code>toHexByCharArray(byte[] bt)</code>方法每次都重复利用字符数组来缓存结果,
8
* <code>toHexByStringBuilder(byte[] bt)</code>方法每次新建一个StringBuilder对象来保存结果,
9
* 因为新建对象是要耗费时间的,所以从测试结果来看,<code>toHexByCharArray(byte[] bt)</code>方法
10
* 所花费时间仅为<code>toHexByStringBuilder(byte[] bt)</code>方法的40%。
11
* </p>
12
*
13
* @author <a href="mailto:eli.wuhan@gmail.com">屹砾</a>,博客:<a
14
* href=http://eli.blogjava.net target="_blank">屹砾之家</a>
15
* @version Nov 23, 2007
16
*/
17
public class StringProcessSample
{
18
// 十六进制数字
19
20
private static char[] HEX =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8',
21
'9', 'A', 'B', 'C', 'D', 'E', 'F' };
22
23
// 缓存十六进制数字字符串
24
25
private char[] ch = new char[32];
26
27
/** *//**
28
* 将指定的byte数组转换成十六进制数字字符串。
29
*
30
* @param bt
31
* byte数组
32
* @return 十六进制数字字符串。
33
*/
34
public String toHexByCharArray(byte[] bt)
{
35
int len = bt.length;
36
for (int i = 0; i < len; i++)
{
37
ch[i * 2] = HEX[bt[i] >> 4 & 0xF];
38
ch[i * 2 + 1] = HEX[bt[i] & 0xF];
39
}
40
return new String(ch, 0, len * 2);
41
}
42
43
/** *//**
44
* 将指定的byte数组转换成十六进制数字字符串。
45
*
46
* @param bt
47
* byte数组
48
* @return 十六进制数字字符串。
49
*/
50
public String toHexByStringBuilder(byte[] bt)
{
51
StringBuilder sb = new StringBuilder();
52
for (byte b : bt)
{
53
sb.append(HEX[b >> 4 & 0xF]);
54
sb.append(HEX[b & 0xF]);
55
}
56
return sb.toString();
57
}
58
59
public void test()
{
60
// 准备一个字节数组
61
62
byte[] bt = new byte[]
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15,
63
14, 16 };
64
65
int loop = 10, times = 1000000;
66
long s1 = 0L, s2 = 0L, s3 = 0L, t1 = 0L, t2 = 0L, tl1 = 0L, tl2 = 0L;
67
68
// 执行十次运算测试
69
70
for (int k = 1; k <= loop; k++)
{
71
// 转换执行速度很快,连接执行很多次来计算时间
72
73
s1 = System.currentTimeMillis();
74
for (int i = 0; i < times; i++)
{
75
toHexByCharArray(bt);
76
}
77
s2 = System.currentTimeMillis();
78
for (int i = 0; i < times; i++)
{
79
toHexByStringBuilder(bt);
80
}
81
s3 = System.currentTimeMillis();
82
83
t1 = s2 - s1;// 使用char[]运行times次的时间
84
85
tl1 += t1;// 时间累加
86
87
t2 = s3 - s2;// 使用StringBuilder运行times次的时间
88
89
tl2 += t2;// 时间累加
90
91
System.out.println("\t" + k + ". char[]:" + t1
92
+ "ms StringBuilder:" + t2 + "ms");
93
}
94
System.out.println("\ttotal " + loop + " times");
95
System.out.println("\t char[]: " + tl1 + "ms StringBuilder: "
96
+ tl2 + "ms");
97
System.out.println("\t char[]: " + (float) tl1 / tl2 * 100
98
+ "% StringBuilder: " + (float) tl2 / tl1 * 100 + "%");
99
}
100
101
public static void main(String[] args)
{
102
new StringProcessSample().test();
103
}
104
}
105

从上面的测试结果可以看出:使用基本类型的性能要比使用对象的性能高出2倍多,所以为了性能应该尽量在不违反OOP的条件下采用基本数据类型。