应将IPv4字符串解析为32位无符号整数再比较;先按"."拆分确保4段,每段验证为0~255的整数,再计算为long值:seg0<<24 | seg1<<16 | seg2<<8 | seg3。

Java 中对包含 IP 地址的字符串列表按网络地址大小排序,不能直接用字符串比较(比如 "192.168.1.10" 和 "192.168.1.2" 按字典序会错),必须先将 IP 字符串解析为数值(如 32 位整数),再基于数值比较。
把 IPv4 字符串转成 long 值用于比较
IPv4 地址是 4 段 0~255 的十进制数,可映射为一个 32 位无符号整数。例如 "192.168.1.2" → 192×256³ + 168×256² + 1×256 + 2。用 long 存更安全(避免 int 符号问题)。
- 拆分字符串(用
"."),确保恰好 4 段且每段是合法数字(0~255) - 每段转
int,左移对应字节位(seg0 ) - 结果作为比较依据,越小的数值代表越小的网络地址
用 Comparator 匿名类或 Lambda 实现
在 Collections.sort() 或 list.sort() 中传入自定义 Comparator:
list.sort((s1, s2) -> {
long ip1 = ipToLong(s1);
long ip2 = ipToLong(s2);
return Long.compare(ip1, ip2); // 升序
});注意:不要用 ip1 - ip2,可能溢出;必须用 Long.compare()。
立即学习“Java免费学习笔记(深入)”;
封装一个健壮的 ipToLong 方法
处理异常输入(空、格式错误、超范围)时建议抛出 IllegalArgumentException,便于调试:
static long ipToLong(String ip) {
String[] parts = ip.split("\.");
if (parts.length != 4) throw new IllegalArgumentException("Invalid IPv4: " + ip);
long result = 0;
for (int i = 0; i < 4; i++) {
int seg = Integer.parseInt(parts[i]);
if (seg < 0 || seg > 255) throw new IllegalArgumentException("Invalid segment: " + seg);
result = (result << 8) | seg;
}
return result;
}支持 IPv4 网络前缀(如 192.168.1.0/24)的简化处理
如果字符串含 CIDR 表示法(如 "10.0.0.0/8"),可只取斜杠前部分做 IP 解析;若需按网络地址(而非主机地址)排序,应先归一化为网络地址(即掩码后清零):
- 提取 IP 部分(用
ip.split("/")[0]) - 解析为 long 后,根据子网掩码长度计算网络地址:
ip & (~0L - 用该网络地址值参与比较
不复杂但容易忽略:IP 字符串排序本质是数值排序,关键在正确解析和安全比较。


















