JAVA字符串补0效率测试

两个方法:

public static String getPreZeroNumber(int num,String str){
        int strLen = str.length();
        if (strLen < num) {
            while (strLen < num) {
                StringBuffer sb = new StringBuffer();
                sb.append("0").append(str);//左补0
                // sb.append(str).append("0");//右补0
                str = sb.toString();
                strLen = str.length();
            }
        }
        return str;
    }
public static String getPreZeroNumber2(int num,String str){
        int strLen = str.length();
        if(str.length() < num){
            for(int i = strLen; i<= num;i++){
                str = "0"+str;
            }
        }
        return str;
    }

测试:

long startMili=System.currentTimeMillis();
        String str1 = getPreZeroNumber(900000,"1");
        long endMili=System.currentTimeMillis();
        System.out.println("str1.length():"+str1.length()+" 总耗时为:"+(endMili-startMili)+"毫秒");

        long startMili2=System.currentTimeMillis();
        String str2 = getPreZeroNumber2(900000,"1");
        long endMili2=System.currentTimeMillis();
        System.out.println("str2.length():"+str2.length()+" 总耗时为2:"+(endMili2-startMili2)+"毫秒");

结果:

结果很意外,按理说,StringBuffer的效率要比String的高的多,结果两个方法的效率却刚好反过来。

原因嘛,应该是方法:

getPreZeroNumber

创建并且修改了多个对象,而方法:

getPreZeroNumber2

则比较单纯,只是修改了String对象。

另一个原因可能是for循环和while循环的效率问题,于是新建了第三个方法

public static String getPreZeroNumber3(int num,String str){
        int strLen = str.length();
        if (strLen < num) {
            for(int i = strLen; i<= num;i++){
                StringBuffer sb = new StringBuffer();
                sb.append("0").append(str);
                str = sb.toString();
            }
        }
        return str;
    }

因为上面测试耗时挺长,所有改小了数量

long startMili=System.currentTimeMillis();
        String str1 = getPreZeroNumber(500000,"1");
        long endMili=System.currentTimeMillis();
        System.out.println("str1.length():"+str1.length()+" 总耗时为:"+(endMili-startMili)+"毫秒");

        long startMili2=System.currentTimeMillis();
        String str2 = getPreZeroNumber2(500000,"1");
        long endMili2=System.currentTimeMillis();
        System.out.println("str2.length():"+str2.length()+" 总耗时为2:"+(endMili2-startMili2)+"毫秒");

        long startMili3=System.currentTimeMillis();
        String str3 = getPreZeroNumber3(500000,"1");
        long endMili3=System.currentTimeMillis();
        System.out.println("str3.length():"+str3.length()+" 总耗时为3:"+(endMili3-startMili3)+"毫秒");

结果如下:

事实证明,方法3修改while循环为for循环后,效率变慢了......

修改测试循环次数为100000次,

long startMili=System.currentTimeMillis();
        getPreZeroNumber(100000,"1");
        long endMili=System.currentTimeMillis();
        System.out.println("总耗时为:"+(endMili-startMili)+"毫秒");

        long startMili2=System.currentTimeMillis();
        getPreZeroNumber2(100000,"1");
        long endMili2=System.currentTimeMillis();
        System.out.println("总耗时为2:"+(endMili2-startMili2)+"毫秒");

        long startMili3=System.currentTimeMillis();
        getPreZeroNumber3(100000,"1");
        long endMili3=System.currentTimeMillis();
        System.out.println("总耗时为3:"+(endMili3-startMili3)+"毫秒");

结果如下:

方法3和方法2效率非常接近了......

再次修改循环次数 10000次:

long startMili=System.currentTimeMillis();
        String str1 = getPreZeroNumber(10000,"1");
        long endMili=System.currentTimeMillis();
        System.out.println("str1.length():"+str1.length()+" 总耗时为:"+(endMili-startMili)+"毫秒");

        long startMili2=System.currentTimeMillis();
        String str2 = getPreZeroNumber2(10000,"1");
        long endMili2=System.currentTimeMillis();
        System.out.println("str2.length():"+str2.length()+" 总耗时为2:"+(endMili2-startMili2)+"毫秒");

        long startMili3=System.currentTimeMillis();
        String str3 = getPreZeroNumber3(10000,"1");
        long endMili3=System.currentTimeMillis();
        System.out.println("str3.length():"+str3.length()+" 总耗时为3:"+(endMili3-startMili3)+"毫秒");

结果如下:

方法3比方法2效率高了......

结论:1.小数据量(10000)下:方法3>方法2>方法1;

2.中数据(100000)量下:方法3=方法2>方法1;

3.大数据(500000)量下:方法2>方法1>方法3;

最后一天上班,敲代码刚好遇到,闲得无聊,顺便测试了下。

转载于:https://my.oschina.net/rockfate/blog/829303

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值