字符串空格

因为上一道有趣的数学题要循环输出空格,在网上找了一篇专门讲字符串空格的贴看看,这是最有研究行的。

 

                        性能测试报告
                                                     (单位:纳秒)
+-----------+---------------+---------------+---------------+
|           |    char[]     | StringBuilder | StringBuffer  |
+-----+-----+---------------+---------------+---------------+
|     |  C  |    164934     |     217095    |    449021     |
|  A  +-----+---------------+---------------+---------------+
|     |  S  |      --       |     488630    |    670028     |
+-----+-----+---------------+---------------+---------------+
|     |  C  |      --       |     454022    |    616225     |
|  B  +-----+---------------+---------------+---------------+
|     |  S  |      --       |     703524    |    862583     |
+-----+-----+---------------+---------------+---------------+

A
-- 对容量进行初始化
B
-- 未对容量进行初始化
C
-- 采用 char 空格填充
S
-- 采用 String 空格填充

 

测试代码
循环 10000 次(用于对 JVM 进行预热)生成 10000 个字符长度的空格,求其平均数。
每种测试执行 5 次,取最小的输出时间。

Java code public class Test {    
   
public static void main(String[] args) {
       
long t0, t1;
        String str
= null ;
       
final int COUNT = 10000 ;
        t0
= System.nanoTime();
       
for ( int i = 0 ; i < COUNT; i ++ ) {
            str
= generateSpace( 10000 );
        }
        t1
= System.nanoTime();
        System.out.println((t1
- t0) / ( float )COUNT);
        System.out.println(str.length());
    }
}
char[] A-C 组代码
Java code 
public static String generateSpace(int count) {
    if(count < 0) {
        throw new IllegalArgumentException("count must be greater than or equal 0.");
    }
    char[] chs = new char[count];
    for(int i = 0; i < count; i++) {
        chs[i] = ' ';
    }
    return new String(chs);
}
StringBuilder A-C 组代码
StringBuilder 与 StringBuffer 的代码一致,A 代码与 B 代码一致,
只是 A 对其容量进行了初始化,而 B 代码没有进行初始。
Java code 
public static String generateSpace(int count) {
    if(count < 0) {
        throw new IllegalArgumentException("count must be greater than or equal 0.");
    }
    // A 组初始化时给定 count,B 组初始化时不给定 count
    StringBuilder sb = new StringBuilder(count);
    for(int i = 0; i < count; i++) {
        sb.append(' ');  // C 组使用字符空格,S 组使用字符串空格
    }
    return sb.toString();
}
 
 
   
   


   
   
结论

从上面的测试结果可以看出,使有不同的方法生成空格的效率有很大的差别,以 char[] 的
执行速度最快。

● StringBuilder 和 StringBuffer 两者由于同步的原因也有不小的差别。
● 由于生成的空格数量是已知的,对于 StringBuilder 和 StringBuffer 的影响是非常大的。
  执行速度相差在 50% 以上。
● append 添加空格时,对于空格的选择也很有讲究。空格属于单字符,采用 char 类型和 String
  执行速度相差也在 50% 以上。

对于生成固定长度空格的方法选择来说,使用 char[], StringBuffer, StringBuilder 哪一种,
如选择后两者,如果容量是已经知的我们得选择对其容量进行初始化,如果是单字符时应采用 char 
进行 append。

当然了,对于 StringBuffer, StingBuilder 来说,算法还可以再进行优化,比如:添加 10000 个
长度的空格的话,可以先添加 100 个生成一个字符串,然后再添加 100 次这个字符串,这时的效率会
有大幅度地提升(经实验 StringBuilder A-C 测试时间为 186928,比原来 217095 提升了 13% 的
速度)。由于生成的空格数量是不定的,在倍数选择以及非整数倍时需要精心地进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值