首页 > 代码库 > Java中高效的版本号比较
Java中高效的版本号比较
我们都知道客户端或者设备端涉及到版本号的地方就必定会涉及到版本升级问题,这时候就需要我们比较版本号的大小,字符串类型的版本号是怎么比较呢?传统来说我们一般会使用compareTo 或者string转double之后比较,这样都会出现bug,今天我说一下一下两种比较方式:用split根据“.”进行拆分,再分别比较每个拆分出来的字符串的大小,下面看代码:(额外说一下,我这里用到的版本号不含字母,所以不考虑含有字母的情况,这个可以自己做相应的修改)
public static int compare(String v1,String v2){ String [] xx=v1.split("\\."); String [] yy=v2.split("\\."); int a=0; try { for(int x=0,y=0;x<xx.length||y<yy.length;x++,y++){ int left=(x<xx.length)?Integer.parseInt(xx[x]):0; int right=(y<yy.length)?Integer.parseInt(yy[y]):0; if(left>right){ a=1; }else if(left==right){ continue; }else{ a=-1; } a=0; } } catch (Exception e) { // TODO: handle exception } return a; }
但是从性能的角度看,这种方式并不是最完美的,我们有一种类似于底层的方式,可以更好的节省性能,运行速度有所提升,废话不多说,看代码:
public static int compare2(String v1,String v2){ int i=0,j=0,x=0,y=0; int v1Len=v1.length(); int v2Len=v2.length(); char c; do { while(i<v1Len){//计算出V1中的点之前的数字 c=v1.charAt(i++); if(c>=‘0‘ && c<=‘9‘){ x=x*10+(c-‘0‘);//c-‘0’表示两者的ASCLL差值 }else if(c==‘.‘){ break;//结束 }else{ //无效的字符 } } while(j<v2Len){//计算出V2中的点之前的数字 c=v2.charAt(j++); if(c>=‘0‘ && c<=‘9‘){ y=y*10+(c-‘0‘); }else if(c==‘.‘){ break;//结束 }else{ //无效的字符 } } if(x<y){ return -1; }else if(x>y){ return 1; }else{ x=0;y=0; continue; } } while ((i<v1Len) || (j<v2Len)); return 0; }
public static void main(String[] args) { System.out.println("比较性能开始>>>>>>>>>>>>>"); String v1="0.10.20.1"; String v2="0.001.02.3"; Long startTime=System.currentTimeMillis(); for(int i=0;i<1000000;i++){ compare(v1, v2); } Long endTime=System.currentTimeMillis(); System.out.println("split方式比较100万次用时"+(endTime-startTime)); Long startTime1=System.currentTimeMillis(); for(int i=0;i<1000000;i++){ compare2(v1, v2); } Long endTime1=System.currentTimeMillis(); System.out.println("字符char方式比较100万次用时"+(endTime1-startTime1)); }
测试的结果如下:
比较性能开始>>>>>>>>>>>>>
split方式比较100万次用时538
字符char方式比较100万次用时28
如此一来,高下立判,第一次写博客,有不对的地方还请指正
本文出自 “Java成神之路” 博客,请务必保留此出处http://yao012.blog.51cto.com/12765256/1915026
Java中高效的版本号比较
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。