下劃線轉駝峰,3種實現方式效率對比
阿新 • • 發佈:2019-02-07
一時興起想要比較一下效率如何,也順便貼上程式碼。總體而言,無論是駝峰轉下劃線還是下劃線轉駝峰,一般而言都不會超過5個毫秒,但是這個功能畢竟簡單,積少成多之下,也會顯得有些慢。鑑於毫秒的精度不夠,我採用納秒來量化執行效率。結論是:1.在使用java自帶的正則表示式工具Pattern和Matcher的情況下,耗時非常大,最少也要約300萬納秒約合3毫秒才能完成,而基於字串split或者replace,一般只需要70萬納秒約合0.7毫秒。但是正則工具的程式碼結構邏輯簡單,而基於字串的拆分和替換操作看起來有較多for和if而有些混亂。2.基於StringBuilder進行字串append效率和基於String的字串拼接,在當前場合下效率差距不大,多數情況下兩者都有時間波動偶爾有較大波動,可能和執作的時候CPU時間片分配有關。3.此後的執行時間從5萬納秒到4萬納秒遞減,與第一次時間差距非常大,應該是字串常量池此時起了作用。速度非常快。4.綜合而言,從下劃線轉化為駝峰,比較快的情況穩定在50w納秒左右,而從駝峰轉化為下劃線,耗時大大減少,比較快的情況下不到10萬納秒,常量池其作用後,耗時不足1w納秒,相當於幾個微秒就完成了。環境資訊:I5-6300HQ,12GDDR3記憶體,win10家庭版。程式碼如下:實踐證明這種小功能測效率純粹是閒的蛋疼……
package json.util;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by tm on 2016/11/24.
* time : 15:45
* project_name : code
*/
publicclassUnderLineString2Camel{
/**
* 下劃線轉駝峰
* @param underline
* @return
*/
publicstaticString underline2Camel(String
Pattern pattern =Pattern.compile("[_]\\w");
String camel = underline.toLowerCase();
Matcher matcher = pattern.matcher(camel);
while(matcher.find()){
String w = matcher.group().trim();
camel = camel.replace(w,w.toUpperCase().replace("_",""));
}
return camel;
}
/**
* 駝峰轉下劃線
* @param camel
* @return
*/
publicstaticStringCamel2Underline(String camel){
Pattern pattern =Pattern.compile("[A-Z]");
Matcher matcher = pattern.matcher(camel);
while(matcher.find()){
String w = matcher.group().trim();
camel = camel.replace(w,"_"+w);
}
return camel.toUpperCase();
}
/**
* 駝峰轉下劃線。
* @param camel
* @return
*/
publicstaticStringCamel2Underline2(String camel){
char[] chars = camel.toCharArray();
StringBuilder sb =newStringBuilder();
for(int i=0,j=0;i<chars.length;i++,j++){
char s = chars[i];
if(s+1>65&& s+1<91){
char _ =95;
sb.append(_);
j++;
sb.append(s);
continue;
}
sb.append(s);
}
return sb.toString().toUpperCase();
}
publicstaticvoid main(String[] args){
for(int i =0;i<10;i++){
long start =System.nanoTime();
camelNamesb("QW_ABD_XYZN");
System.out.println(System.nanoTime()- start);
}
}
publicstaticString camelName(String name){
String result ="";
// 快速檢查
if(name ==null|| name.isEmpty()){
// 沒必要轉換
return"";
}elseif(!name.contains("_")){
// 不含下劃線,僅將首字母小寫
return name.substring(0,1).toLowerCase()+ name.substring(1);
}
// 用下劃線將原始字串分割
String camels[]= name.split("_");
for(String camel : camels){
// 跳過原始字串中開頭、結尾的下換線或雙重下劃線
if(camel.isEmpty()){
continue;
}
// 處理真正的駝峰片段
if(result.length()==0){
// 第一個駝峰片段,全部字母都小寫
result+=camel.toLowerCase();
}else{
// 其他的駝峰片段,首字母大寫
result+=camel.substring(0,1).toUpperCase();
result+=camel.substring(1).toLowerCase();
}
}
return result;
}
publicstaticString camelNamesb(String name){
StringBuilder sb =newStringBuilder();
// 快速檢查
if(name ==null|| name.isEmpty()){
// 沒必要轉換
return"";
}elseif(!name.contains("_")){
// 不含下劃線,僅將首字母小寫
return name.substring(0,1).toLowerCase()+ name.substring(1);
}
// 用下劃線將原始字串分割
String camels[]= name.split("_");
for(String camel : camels){
// 跳過原始字串中開頭、結尾的下換線或雙重下劃線
if(camel.isEmpty()){
continue;
}
// 處理真正的駝峰片段
if(sb.length()==0){
// 第一個駝峰片段,全部字母都小寫
sb.append(camel.toLowerCase());
}else{
// 其他的駝峰片段,首字母大寫
sb.append(camel.substring(0,1).toUpperCase());
sb.append(camel.substring(1).toLowerCase());
}
}
return sb.toString();
}
publicstaticString underscoreName(String name){
StringBuilder result =newStringBuilder();
if(name !=null&& name.length()>0){
// 將第一個字元處理成大寫
result.append(name.substring(0,1).toUpperCase());
// 迴圈處理其餘字元
for(int i =1; i < name.length(); i++){
String s = name.substring(i, i +1);
// 在大寫字母前新增下劃線
if(s.equals(s.toUpperCase())&&!Character.isDigit(s.charAt(0))){
result.append("_");
}
// 其他字元直接轉成大寫
result.append(s.toUpperCase());
}
}
return result.toString();
}
publicstaticString camelToUnderline(String param){
if(param==null||"".equals(param.trim())){
return"";
}
int len=param.length();
StringBuilder sb=newStringBuilder(len);
for(int i =0; i < len; i++){
char c=param.charAt(i);
if(Character.isUpperCase(c)){
sb.append("_");
sb.append(Character.toLowerCase(c));
}else{
sb.append(c);
}
}
return sb.toString();
}
}