首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 正確比對 Android App 版本號:避免字串比較陷阱

     編輯:Java 相關知識

App 更新檢查時,版本號比對是核心邏輯。直接使用 String.compareTo() 會導致嚴重錯誤:例如 "9.9.9" 被判定大於 "10.0.1"。本文提供一個健壯的版本號比較工具方法,支援任意段數、前導零、非數字字元防禦。

為何字串比較會失效?

String.compareTo() 採字典序逐字元比較,'9' > '1' 導致 "9.9.9" > "10.0.1",違背語意版本排序規則。

正確演算法:分段數值比較

  1. 以 . 分割版本字串為段陣列。
  2. 逐段轉為整數比較(自動忽略前導零)。
  3. 若前段皆相等,長度較長且剩餘段非全零者視為較新。

Java 實作:compareVersion()

public class VersionUtils {
    /**
     * 比較兩個版本號
     * @return 1: v1 > v2, 0: 相等, -1: v1 < v2
     */
    public static int compareVersion(String v1, String v2) {
        if (v1 == null || v2 == null) throw new IllegalArgumentException("版本號不可為 null");
        if (v1.equals(v2)) return 0;

        String[] seg1 = v1.split("\\.");
        String[] seg2 = v2.split("\\.");
        int len = Math.max(seg1.length, seg2.length);

        for (int i = 0; i < len; i++) {
            int n1 = i < seg1.length ? parseSegment(seg1[i]) : 0;
            int n2 = i < seg2.length ? parseSegment(seg2[i]) : 0;
            if (n1 != n2) return n1 > n2 ? 1 : -1;
        }
        return 0;
    }

    private static int parseSegment(String seg) {
        try {
            // 過濾非數字字元,防止 "1.0.0-beta" 等格式拋出異常
            return Integer.parseInt(seg.replaceAll("\\D", ""));
        } catch (NumberFormatException e) {
            return 0;
        }
    }

    // 測試
    public static void main(String[] args) {
        System.out.println(compareVersion("9.9.9", "10.0.1"));   // -1
        System.out.println(compareVersion("1.0.0", "1.0.0"));    // 0
        System.out.println(compareVersion("2.5.12", "2.5.3"));   // 1
        System.out.println(compareVersion("1.01", "1.001"));     // 0 (前導零無影響)
        System.out.println(compareVersion("1.0.0-alpha", "1.0.0")); // 0 (非數字被忽略)
    }
}

進階擴充:語意化版本支援

若需完整支援 SemVer(如 1.0.0-alpha.1、1.0.0+build.123),建議引入成熟庫:

  • Gradle/Maven 專案: org.apache.maven:maven-artifact 的 DefaultArtifactVersion 或 ComparableVersion。
  • Android 專案: androidx.versionedparcelable:versionedparcelable 內建工具或自行實作 SemVer 解析器。

最佳實踐提醒

  • 版本號統一規範為 Major.Minor.Patch 三段式純數字,避免解析歧義。
  • 伺服器端回傳最新版本號時,務必確保格式一致。
  • 比較邏輯集中在工具類,避免分散在業務程式碼中造成維護困難。

掌握正確的版本號比較邏輯,是保障 App 更新流程可靠性的關鍵一環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved