【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