• 【Java】将hh:mm:ss.mis 格式的字符串截取小时或分钟部分,使用数组下标截取、劈分和正则方式,那种更快?数组下标遥遥领先!


    【需求】

    输入为hh:mm:ss.mis 格式的字符串,需要用函数处理,只保留小时部分或是分钟部分。

    如输入为12:34:56.123,如果保留小时,输出为12:00:00;如果保留分钟,输出为12:34:00。

    【思路】

    要制作处理函数,一种思路是部分截取char数组、一种思路是劈分,一种是用正则直接提取需要的部分,这就带出一个谁速度更快的问题。

    理念上,下标明确的话,数组下标截取速度要高于其它方法;而正则有些小慢。一切都有待实验说话。

    【结论】

    截取最快、劈分其次、正则最慢,截取耗时约为正则的一成。

    因为模式简单,所以正则优势体现不出来,而越简单的模式越有利于基础操作。

    【代码】

    package test;
    
    import java.util.Arrays;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class TimeParser {
        // 劈分方式
        public static String format1(String tim,String hm){
            String[] arr2=tim.split("[:]");
            String h=arr2[0];
            String m=arr2[1];
    
            if(hm.equalsIgnoreCase("h")){
                return h+":00:00";
            }else if(hm.equalsIgnoreCase("m")){
                return h+":"+m+":00";
            }else{
                return null;
            }
        }
    
        // 正则方式
        public static String format2(String tim,String hm){
            Pattern pattern = Pattern.compile("(\\d{2}):(\\d{2}):\\d{2}[.]\\d{3}", Pattern.CASE_INSENSITIVE);
    
            Matcher matcher=pattern.matcher(tim);
            while(matcher.find()) {
                String h=matcher.group(1);
                String m=matcher.group(2);
    
                if(hm.equalsIgnoreCase("h"))
                    return h+":00:00";
                else if(hm.equalsIgnoreCase("m"))
                    return h+":"+m+":00";
                else
                    return null;
    
            }
    
            return null;
        }
        
        // 截取部分char数组方式
        public static String format3(String tim,String hm) {
            if(hm.equalsIgnoreCase("h")){
                char[] arr=tim.toCharArray();
                char[] hs=Arrays.copyOfRange(arr, 0, 2);
                
                return String.valueOf(hs)+":00:00";
            }else if(hm.equalsIgnoreCase("m")){
                char[] arr=tim.toCharArray();
                char[] hs=Arrays.copyOfRange(arr, 0, 5);
                
                return String.valueOf(hs)+":00";
            }else{
                return null;
            }
        }
    
        public static void main(String[] args){
            /*System.out.println(TimeParser.format1("12:34:56.123","h"));
            System.out.println(TimeParser.format2("12:34:56.123","h"));
            System.out.println(TimeParser.format3("12:34:56.123","h"));
            
            System.out.println(TimeParser.format1("12:34:56.123","m"));
            System.out.println(TimeParser.format2("12:34:56.123","m"));        
            System.out.println(TimeParser.format3("12:34:56.123","m"));*/
            
            long startMs=System.currentTimeMillis();
            for(int i=0;i<100000;i++) {
                TimeParser.format1("12:34:56.123","h");
                TimeParser.format1("12:34:56.123","m");
            }
            long endMs=System.currentTimeMillis();
            System.out.println("劈分方式耗时:"+ms2DHMS(startMs,endMs));
            
            startMs=System.currentTimeMillis();
            for(int i=0;i<100000;i++) {
                TimeParser.format2("12:34:56.123","h");
                TimeParser.format2("12:34:56.123","m");
            }
            endMs=System.currentTimeMillis();
            System.out.println("正则方式耗时:"+ms2DHMS(startMs,endMs));
            
            startMs=System.currentTimeMillis();
            for(int i=0;i<100000;i++) {
                TimeParser.format3("12:34:56.123","h");
                TimeParser.format3("12:34:56.123","m");
            }
            endMs=System.currentTimeMillis();
            System.out.println("数组截取方式耗时:"+ms2DHMS(startMs,endMs));
        }
        
        private static String ms2DHMS(long startMs, long endMs) {
            String retval = null;
            long secondCount = (endMs - startMs) / 1000;
            String ms = (endMs - startMs) % 1000 + "ms";
    
            long days = secondCount / (60 * 60 * 24);
            long hours = (secondCount % (60 * 60 * 24)) / (60 * 60);
            long minutes = (secondCount % (60 * 60)) / 60;
            long seconds = secondCount % 60;
    
            if (days > 0) {
                retval = days + "d" + hours + "h" + minutes + "m" + seconds + "s";
            } else if (hours > 0) {
                retval = hours + "h" + minutes + "m" + seconds + "s";
            } else if (minutes > 0) {
                retval = minutes + "m" + seconds + "s";
            } else if(seconds > 0) {
                retval = seconds + "s";
            }else {
                return ms;
            }
    
            return retval + ms;
        }
    }

    【输出】

     以下是某一次输出,执行多次效果和以下情况类似,在其它机器上也应该是同样的比例,大家可以去试试。

    劈分方式耗时:183ms
    正则方式耗时:219ms
    数组截取方式耗时:25ms

    END

  • 相关阅读:
    ListComparer
    C#.net中类与结构的区别
    对C# 中堆栈,堆,值类型,引用类型的理解
    一道面试题
    Mvc不等于三层架构
    SQL养成一个好习惯是一笔财富
    清除MSSQL事务日志文件
    面向对象设计(OOD)五大基本原则
    .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一
    IIS7 Login failed for user IIS APPPOOL\ASP.NET v4.0
  • 原文地址:https://www.cnblogs.com/heyang78/p/16138628.html
Copyright © 2020-2023  润新知