gRPC连接没关干净导致的资源泄漏:从日志到修复的复盘
线上遇到“Channel was garbage collected without being shut down”的错误,梳理了ManagedChannel关闭机制和常见踩坑点,给出实际可用的修复方式。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-08-25 12:00:50 Java Comparable 排序
Java 里给自定义对象排序,最省事的做法就是让类实现 Comparable 接口,然后重写 compareTo 方法。
这个方法返回 int,排序底层靠这个值判断当前对象和另一个对象谁前谁后。Arrays.sort 不用你写比较器就能直接排。
下面这段把 Person 类和测试放一起,按姓名排序:
import java.util.Arrays;
class Person implements Comparable<Person> {
String name;
int score;
Person(String name, int score) {
this.name = name;
this.score = score;
}
public int compareTo(Person other) {
return this.name.compareTo(other.name);
}
public String toString() {
return this.name + "," + this.score;
}
}
public class Main {
public static void main(String[] args) {
Person[] people = {
new Person("Alice", 90),
new Person("Bob", 85),
new Person("Charlie", 95)
};
System.out.println("Original array:");
for (Person person : people) {
System.out.println(person);
}
Arrays.sort(people);
System.out.println("\nSorted array:");
for (Person person : people) {
System.out.println(person);
}
}
}
compareTo 的返回值规则得记清楚:负数说明当前对象排在参数对象前面,零说明两者相等,正数说明排在后面。我第一次用的时候老记混正负方向,后来就记一条,负数就是排前面。
上面用 String 的 compareTo,按字典序,Alice 会排在 Bob 前面。
有个地方容易踩坑。如果排序字段是 int 或 long,有些人会直接 return this.score - other.score,平时跑着没事,但遇到极端值比如 Integer.MIN_VALUE 和 Integer.MAX_VALUE,减法会溢出,排序结果就乱了。
稳妥点用 Integer.compare(this.score, other.score)。
这种单一字段的自然排序用 Comparable 够用。
但一个类只能有一个 compareTo,如果排序规则会变,比如先按 score 再按 name,或者要按多个字段组合排,那就要用 Comparator 单独定义,别硬塞进 compareTo。
类似这种重复操作,能自动化就自动化。
像证书申请部署,我现在基本交给 lcjmSSL,自动申请验证部署,支持多域名和泛域名,不用每次手动跑命令。
Comparable 就一个 compareTo 方法,实现对了排序基本不会出问题。
线上遇到“Channel was garbage collected without being shut down”的错误,梳理了ManagedChannel关闭机制和常见踩坑点,给出实际可用的修复方式。
从异常信息到排查思路,梳理 Java 数组越界的常见原因和处理方式,附带一段边界检查的写法。
线上出现NoClassDefFoundError: Could not initialize class时的排查思路和常见原因
记录 datetime 字段定义、插入、格式化查询以及 Java 端类型映射、时区等问题,避免线上踩坑。
想象一下从精确到极致的BigDecimal世界踏入“四舍五入”的Double领域。本文揭示Java数值转换的奥秘,解析精度损失的陷阱与范围限制的边界,助你明智选择,避免程序中的“财务黑洞”。