Java中compareTo用法及原始碼解析
阿新 • • 發佈:2018-11-02
最近遇到一個問題,在日期比較的時候,很麻煩,因為日期比較沒有大於等於,只有大於或者小於,這就導致在比較時間的時候特別麻煩,而且還要由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