You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简便比较两个URI的scheme:host:port部分(基础URI)是否相等?

如何简便比较两个URI的scheme:host:port部分?

当然有更简洁的方式,不用像你那样手动逐个判断scheme、host和port!Java的URI类本身就提供了可靠的相等性判断逻辑,我们可以利用这一点来简化代码。

方法一:构造基础URI直接对比

核心思路是把需要对比的URI转换成只保留scheme、host、port的"基础URI",然后直接调用equals()方法比较即可,URI的equals会帮我们正确处理这几个部分的匹配逻辑(包括大小写、默认端口等细节)。

示例代码:

URI firstURI = new URI("https://localhost:8000");
URI secondURI = new URI("https://localhost:8000/testing");

// 提取第二个URI的基础部分(仅保留scheme、host、port)
URI secondBaseURI = new URI(
    secondURI.getScheme(),
    null,  // userInfo
    secondURI.getHost(),
    secondURI.getPort(),
    null,  // path
    null,  // query
    null   // fragment
);

// 直接对比两个基础URI
if (!firstURI.equals(secondBaseURI)) {
    // 处理不匹配的情况
}

方法二:利用resolve简化路径处理

如果你的第一个URI本身就是不带路径的基础URI(比如https://localhost:8000),还可以通过resolve("/")把第二个URI的路径重置为根路径,再对比:

URI firstURI = new URI("https://localhost:8000");
URI secondURI = new URI("https://localhost:8000/testing");

// 注意:如果firstURI末尾没有斜杠,而resolve得到的URI有斜杠,equals会返回false
// 可以统一给firstURI加上斜杠,或者用normalize处理
URI secondRootURI = secondURI.resolve("/").normalize();
URI firstRootURI = firstURI.resolve("/").normalize();

if (!firstRootURI.equals(secondRootURI)) {
    // 处理不匹配的情况
}

为什么比手动判断好?

  • 更简洁:不用写一堆||和&&的判断逻辑
  • 更可靠:URI的equals方法已经考虑了很多细节,比如host的大小写不敏感、默认端口的处理(比如http的80端口如果省略,和显式写80会被认为相等),手动判断很容易漏掉这些场景。

内容的提问来源于stack exchange,提问作者user6800688

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:18:25