1. 程式人生 > >Java中compareTo用法及原始碼解析

Java中compareTo用法及原始碼解析

最近遇到一個問題,在日期比較的時候,很麻煩,因為日期比較沒有大於等於,只有大於或者小於,這就導致在比較時間的時候特別麻煩,而且還要由string轉成date格式才能比較,下面是我使用compareTo比較時間字串的程式碼:

    String putStartTime = DateUtil.formatDate(adverInformation.getPutStartTime());
	String putEndTime = DateUtil.formatDate(adverInformation.getPutEndTime()); 
	String currentTime = DateUtil.getCurrentTime("yyyy-MM-dd");
	int compareTo = putStartTime.compareTo(currentTime);
	int compareTo2 = currentTime.compareTo(putEndTime); 
			
   if(compareTo>0 || compareTo2>0) {
		adverInformation.setAdverStatus(AdverConst.ADVER_STATUS_OUTLAUNCH);
	}else {
		adverInformation.setAdverStatus(AdverConst.ADVER_STATUS_INLAUNCH);
	}

下面來看一下原始碼:

  public int compareTo(String anotherString) {
        int len1 = value.length;//獲取第一個引數的字串長度
        int len2 = anotherString.value.length;//獲取第二份字串長度
        int lim = Math.min(len1, len2);//獲取兩者字串長度最短的
        char v1[] = value;//第一個引數的值
        char v2[] = anotherString.value;//第二個引數的值

        int k = 0;
        while (k < lim) {//獲取長度最短的,然後和0、1、2、3..比較
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;//比較當前引數的第K位知否相等,如果相等,則繼續++,如果不想等,則直接返回差值
            }
            k++;
        }
        return len1 - len2;//如果引數前面的幾位字元都是一樣的話,那就直接用兩個引數的長度相減
    }

以下是幾個典型的例子僅供參考:

java中的compareto方法,返回參與比較的前後兩個字串的asc碼的差值

String a = "a";
String b = "b";
System.out.println(a.compareTo(b));
輸出值-1

String a = "b";
String b = "a";
System.out.println(a.compareTo(b));
輸出值1


String a = "a";
String b = "a";
System.out.println(a.compareTo(b));
輸出0


兩個字串首字母不同,則該方法返回首字母的asc碼的差值
String a = "abc";
String b = "bcdfg";
System.out.println(a.compareTo(b));
輸出-1

參與比較的兩個字串如果首字元相同,則比較下一個字元,直到有不同的為止,返回該不同的字元的asc碼差值
String a = "abcdef";
String b = "abe";
System.out.println(a.compareTo(b));
輸出-2

兩個字串不一樣長,可以參與比較的字元又完全一樣,則返回兩個字串的長度差值
String a = "abc";
String b = "abcdefg";
System.out.println(a.compareTo(b));
輸出-4
String a = "abcde";
String b = "abcd";
System.out.println(a.compareTo(b));
輸出1

目前compareTo專案中的用途是比較版本號的高低
String a = "1.0.0";
String b = "1.0.1";
System.out.println(a.compareTo(b));
輸出-1

日期比較,跟字串比較基本類似,a日期在b後面,所以返回1
String a = "2018-08-23";
String b = "2018-08-15";
System.out.println(a.compareTo(b));
輸出1

總結:返回整數則說明a大於b,返回0則表示a等於b,返回負數則表示a小於b。
坑位:compareTo比較返回的值不僅僅只有1、0、-1,最好判斷是大於0還是小於0