Java中高效的版本号比较

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中高效的版本号比较的主要内容,如果未能解决你的问题,请参考以下文章

java 比较版本号 - 数字版本比较

java:版本号比较(compare version string)

java:版本号比较(compare version string)

软件版本号比较 java工具类

LeetCode 165. 比较版本号c++/java详细题解

java比较客户端版本号